codeforce Pashmak and Buses(dfs枚举)


 1 /*
 2    题意:n个同学,k个车, 取旅游d天!
 3    要求所有的学生没有两个或者两个以上的在同一辆车上共同带d天! 输出可行的方案!
 4    
 5    对于d行n列的矩阵,第i行第j列表示的是第i天第j个同学所在的车号!
 6    也就是保证所有行不全相同,即每一列都是不相同的!
 7    如果每一列都不相同就是表示第j个同学(第j列)在这d天中不会和其他同学(列)在这d天中 都在同一辆车中! 
 8    
 9    思路:对于每一列我们枚举d天该学生所在的车号!它的下一列只保证有一个元素和它不同就行了!依次下去!
10    
11    还有一共有 d 个位置来填充车号(1....k)!每一个位置的数字都可以是(1...k)中的一个数字。
12    总共的枚举次数为 k^d, 一共有n个同学,枚举n次就可以了,所以有 k^d >=n才有解! 
13 */
14 #include<iostream>
15 #include<cstdio>
16 using namespace std;
17 
18 int ret[1005][1005];
19 int a[1005];
20 int n, k, d;
21 int cnt;
22 bool dfs(int cur){
23    if(cur>d){
24         ++cnt;
25         for(int i=1; i<=d; ++i)
26        ret[i][cnt]=a[i];
27         if(cnt==n)
28           return true;
29      return false;
30    }
31    for(int i=1; i<=k; ++i){
32        a[cur]=i;
33        if(dfs(cur+1))//强力剪枝....搜索完成后不在进行搜索! 
34           return true;
35    }
36    return false;
37 }
38 
39 int main(){
40    while(scanf("%d%d%d", &n, &k, &d)!=EOF){
41           cnt=0;
42           int kk=k;
43           bool flag=false;
44           for(int i=1; i<=d; ++i){//保证k^d>=n才可能有解! 
45                 if(kk>=n){
46               flag=true;
47               break;
48           }
49           kk*=k;
50        }
51        if(flag){
52            dfs(1);
53            for(int i=1; i<=d; ++i){
54               for(int j=1; j<=n; ++j){
55                  printf("%d", ret[i][j]);
56                  if(j!=n)  printf(" "); 
57               }
58               printf("\n");
59            }
60        }
61        else printf("-1\n");
62    }
63    return 0;
64 }

优质内容筛选与推荐>>
1、51NOD 1449 砝码称重(贪心+进制思想)
2、正则表达式中符号的含义(可能不是很全)
3、MT【80】单调性求函数表达式
4、事故分析
5、centos 7 服务初始化


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号