1 条题解
-
0
#include<bits/stdc++.h> using namespace std; int n; //n表示有n个号码(分别是1~n) int a[110]; //a数组表示一排格子,它们以后用来存号码的(a[i]=7表示第i个格子存了号码7) bool v[110]; //标记每个号码是否可填,v[i]==0表示号码i可用:可以用来填进格子。 反之不行 void dfs(int k)//表示当前要做的事情是:第k个格子要找号码来存 { if(k==n+1) //什么?你是第n+1个格子?说明前面n个格子都找到了号码存在各自的格子里 { for(int i=1;i<n;i++) printf("%d ",a[i]); //输出第1~n个格子各自存的号码 printf("%d\n",a[n]); } else { for(int i=1;i<=n;i++) if( v[i]==0 ) // 如果号码i是可用的 { v[i]=1; //占用资源:号码i准备存进格子里,设置为该号码已经被使用了(1) a[k]=i; //占用资源:第k个格子存进号码i, dfs(k+1); //下一个格子(k+1)叫停,说轮到它找号码存了 a[k]=0; //释放资源:第k个格子踢走了存在自己里面的号码 v[i]=0; //释放资源:号码i被踢后,设置自己为可用,方便后面有格子找号码 } } } int main() { scanf("%d", &n); memset(v, 0, sizeof(v)); //就是把v数组全部变成 0(初始化) dfs(1); //从第1个格子开始找号码存 return 0; }
- 1
信息
- ID
- 44
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 7
- 标签
- 递交数
- 835
- 已通过
- 162
- 上传者