• 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("
    ");
    59            }
    60        }
    61        else printf("-1
    ");
    62    }
    63    return 0;
    64 }
  • 相关阅读:
    【模板】常系数线性递推
    【模板】多项式除法
    【模板】多项式求逆
    codeblock的一个小问题
    IP分片浅析
    [LeetCode] Excel Sheet Column Number
    [LeetCode] Excel Sheet Column Title
    [LeetCode] Maximum Gap
    编程计算并输出1~n之间所有素数之和
    [LeetCode] Compare Version Numbers
  • 原文地址:https://www.cnblogs.com/hujunzheng/p/3916908.html
Copyright © 2020-2023  润新知