八皇后 (DFS)
题目描述
检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。
上面的布局可以用序列2 4 6 1 3 5来描述,第i个数字表示在第i行的相应位置有一个棋子,如下:
行号 1 2 3 4 5 6
列号 2 4 6 1 3 5
这道题其实理解了很简单,就是这个点放了棋子,四条线上不再能放棋子
注意:如果横坐标是x,纵坐标是y,那么斜着的坐标就分别是y+x,y-x+n(n代表棋盘的大小,n皇后)
//如果无法理解,就画画图,自己就看出来了
我们把函数dfs的成员k看成点的横坐标
for循环里的 i 看做y坐标,直接纯dfs就可以写了
1 void dfs(int k) 2 { 3 if(k==n+1) 4 { 5 ans++; 6 if(ans<=3) 7 { 8 for(int i=1;i<=n;++i) 9 { 10 cout<<v[i]<<" "; 11 } 12 cout<<endl; 13 } 14 15 } 16 else 17 { 18 for(int i=1;i<=n;++i) 19 { 20 if(b[i]==0&&c[i+k]==0&&d[i-k+n]==0) 21 { 22 a[k]=1; 23 b[i]=1; 24 c[i+k]=1; 25 d[i-k+n]=1; 26 v[k]=i; 27 dfs(k+1); 28 a[k]=0; 29 b[i]=0; 30 c[i+k]=0; 31 d[i-k+n]=0; 32 } 33 } 34 } 35 }
看着长,不难