八皇后问题
在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。
分析:经典的深搜题目,难点在于,如何标记两个对角线已经被占领。
仔细观察棋盘我们发现,从左下到右上的那条斜线横纵坐标之和都相等,所以可以利用这个性质标记一条对角线
另一条对角线横纵坐标之差都相等,为了防止数组越界我们+8来标记另一条
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 6 using namespace std; 7 8 int g[10][10]; 9 bool line[10],xie1[20],xie2[20]; 10 int ans; 11 12 inline void dfs(int pos) 13 { 14 for(int i=1;i<=8;i++) 15 { 16 if(!line[i]&&!xie1[i+pos]&&!xie2[pos-i+7]) 17 { 18 g[i][pos]=1; 19 line[i]=true; 20 xie1[i+pos]=true; 21 xie2[pos-i+7]=true; 22 if(pos==8) 23 { 24 ans++; 25 printf("No. %d\n",ans); 26 for(int j=1;j<=8;j++) 27 { 28 for(int k=1;k<=8;k++) 29 printf("%d ",g[j][k]); 30 printf("\n"); 31 } 32 } 33 else dfs(pos+1); 34 g[i][pos]=0; 35 line[i]=false; 36 xie1[i+pos]=false; 37 xie2[pos-i+7]=false; 38 } 39 } 40 } 41 42 int main() 43 { 44 dfs(1); 45 return 0; 46 }
八皇后2
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 6 using namespace std; 7 8 int a[100][10],b[10]; 9 bool line[10],xie1[20],xie2[20]; 10 int ans; 11 12 inline void dfs(int pos) 13 { 14 for(int i=1;i<=8;i++) 15 { 16 if(!line[i]&&!xie1[i+pos]&&!xie2[pos-i+7]) 17 { 18 b[pos]=i; 19 line[i]=true; 20 xie1[i+pos]=true; 21 xie2[pos-i+7]=true; 22 if(pos==8) 23 { 24 ans++; 25 for(int j=1;j<=8;j++) 26 a[ans][j]=b[j]; 27 } 28 else dfs(pos+1); 29 b[pos]=0; 30 line[i]=false; 31 xie1[i+pos]=false; 32 xie2[pos-i+7]=false; 33 } 34 } 35 } 36 37 int main() 38 { 39 dfs(1); 40 int n; 41 scanf("%d",&n); 42 for(int i=1;i<=n;i++) 43 { 44 int q; 45 scanf("%d",&q); 46 for(int j=1;j<=8;j++) 47 printf("%d",a[q][j]); 48 printf("\n"); 49 } 50 return 0; 51 }