1 条题解
-
-1
在平时里做题时不要学习这种行为!!
考场上不知正解,只知乱搞。
写完 DFS 后,发现跑出前 组解是容易的。
关于如何处理对角线,列的可放性,属于基础内容。这里不再赘述。
但跑出所有解是困难的,在 是需要 。
但这个时间也不是太长,考虑打表。
跑出前 组解后,直接输出方案数并退出程序。
这一题就做完了。
#include<bits/stdc++.h> using namespace std; int n,k; int c[20]; int cnt; int ans[16]={/*此处略去,表你自己打去*/}; void dfs(int lin,int row,int sta,int stu) { if(lin==n+1) { ++cnt; if(cnt<=k) { for(int i=1;i<=n;i++) cout<<c[i]<<' '; cout<<'\n'; } else { cout<<ans[n]<<'\n'; exit(0); } } else { for(int i=1;i<=n;i++) { if((row&(1<<(i-1)))==0&&(sta&(1<<(i+lin-1)))==0&&(stu&(1<<(i-lin+n)))==0) { c[lin]=i; dfs(lin+1,row|(1<<(i-1)),sta|(1<<(i+lin-1)),stu|(1<<(i-lin+n))); c[lin]=0; } } } } signed main() { cin>>n>>k; dfs(1,0,0,0); return 0; }在平时里做题时不要学习这种行为!!
- 1
信息
- ID
- 603
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 6
- 已通过
- 3
- 上传者