专业的传媒行业网站开发,广东一站式网站建设费用,上海建筑设计院工资,网络服务器施工方案1 /*2 题意#xff1a;n个同学#xff0c;k个车#xff0c; 取旅游d天#xff01;3 要求所有的学生没有两个或者两个以上的在同一辆车上共同带d天#xff01; 输出可行的方案#xff01;4 5 对于d行n列的矩阵#xff0c;第i行第j列表示的是第i天第j个同学所… 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 #includeiostream
15 #includecstdio
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(curd){
24 cnt;
25 for(int i1; id; i)
26 ret[i][cnt]a[i];
27 if(cntn)
28 return true;
29 return false;
30 }
31 for(int i1; ik; i){
32 a[cur]i;
33 if(dfs(cur1))//强力剪枝....搜索完成后不在进行搜索
34 return true;
35 }
36 return false;
37 }
38
39 int main(){
40 while(scanf(%d%d%d, n, k, d)!EOF){
41 cnt0;
42 int kkk;
43 bool flagfalse;
44 for(int i1; id; i){//保证k^dn才可能有解
45 if(kkn){
46 flagtrue;
47 break;
48 }
49 kk*k;
50 }
51 if(flag){
52 dfs(1);
53 for(int i1; id; i){
54 for(int j1; jn; 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 } 转载于:https://www.cnblogs.com/hujunzheng/p/3916908.html