#include<string>#include<cstdio>#include<iostream>#include<algorithm>usingnamespace std;//由于每次扫描检查次数太多,导致超时int N, pos;int s[20][20];bool vis[20][20];int res[100010][20];boolin(int x,int y){return x >=1&& x <= N && y >=1&& y <= N;}//检查当前行和当前列有无占用以及所有对角线intcheck(int a,int b){if(s[a][b])return1;//行和列for(int i =1; i <= N; i++)if(s[a][i])return1;for(int i =1; i <= N; i++)if(s[i][b])return1;//对角线int x = a, y = b;for(int i =1; i <= N; i++){
x +=1, y +=1;if(!in(x, y))break;if(s[x][y])return1;}
x = a, y = b;for(int i =1; i <= N; i++){
x -=1, y -=1;if(!in(x, y))break;if(s[x][y])return1;}
x = a, y = b;for(int i =1; i <= N; i++){
x -=1, y +=1;if(!in(x, y))break;if(s[x][y])return1;}
x = a, y = b;for(int i =1; i <= N; i++){
x +=1, y -=1;if(!in(x, y))break;if(s[x][y])return1;}return0;}voiddfs(int a){if(a == N +1)//N = 3{for(int i =1; i <= N; i++)for(int j =1; j <= N; j++)if(s[i][j]){res[pos][i]= j;break;}
pos ++;return;}//扫描当前行的列for(int i =1; i <= N; i++){if(!check(a, i)){
s[a][i]=1;dfs(a +1);
s[a][i]=0;}}}voidprint(){for(int i =0; i <3; i++){for(int j =1; j <= N; j++)
cout << res[i][j]<<" ";
cout << endl;}
cout << pos << endl;}intmain(){
cin >> N;dfs(1);print();return0;}
参考代码2.0: 关于标记对角线的方法,i + j 和 i - j + N 。效果如图,即同一对角线数字都是一样的;同样,这样可以减少循环查找所需要的的时间。
#include<string>#include<cstdio>#include<ctime>#include<iostream>#include<algorithm>usingnamespace std;int N, pos;int s[20][20], f[100], b[100], c[100], d[100];bool vis[20][20];int res[100010][20];voiddfs(int a){if(a == N +1)//N = 3{for(int i =1; i <= N; i++)for(int j =1; j <= N; j++)if(s[i][j]){res[pos][i]= j;break;}
pos ++;return;}//扫描当前行的列for(int i =1; i <= N; i++){if(!b[i]&&!c[a + i]&&!d[a - i + N]){
s[a][i]=1;
b[i]=1; c[a + i]=1;
d[a - i + N]=1;dfs(a +1);
s[a][i]=0;
b[i]=0; c[a + i]=0;
d[a - i + N]=0;}}}voidprint(){for(int i =0; i <3; i++){for(int j =1; j <= N; j++)
cout << res[i][j]<<" ";
cout << endl;}
cout << pos << endl;}intmain(){
cin >> N;dfs(1);print();return0;}
题目链接:P1219 八皇后题解: 就是一道DFS搜索加回溯,关键就是判断横纵对角线有没有值;可以直接for循环循环地图判断,如代码1.0,但会超时;所以最好用2.0直接将对角线和横纵弄到一个数组,如2.0的图示;输出时可以判断前三个输出,并不一定要保存下来,如3.0所示;以前的题解:点击这里!知识点: 对角线的判断可以 i + j 和 i - j + N 进行判断,如图所示。参考代码1.0...