1213:八皇后问题
首先可以试图去简化问题,将问题转化为为每一列确定一个有效的行号。
因为同一列只能有一个皇后,并且需要在八列中确定八个皇后,即每一列都必定有且只有一个皇后。
经过简化后,显然,通过一个一维数组即可以确定一组有效解。
关于check:
- 不为同一行或同一列的判定比较简单(这里省略)
- (i1,j1)与(i2,j2)在同一条斜线上的判定:i1-i2==j1-j2 || i1-i2==j2-j1
问题经过这样一次抽丝剥茧后,剩余的思路大致就是深度搜索、临界输出。
特别重复:a[j]表示第j列的皇后所在的行数
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 5 const int N=10; 6 int ans,a[N]; 7 void print(){ 8 printf("No. %d\n",++ans); 9 for(int i=1;i<=8;i++){ 10 for(int j=1;j<=8;j++) 11 if(a[j]==i)printf("1 "); 12 else printf("0 "); 13 printf("\n"); 14 } 15 } 16 bool check(int x,int d){ 17 for(int i=1;i<d;i++){ 18 if(a[i]==x||x-a[i]==d-i||x-a[i]==i-d) 19 return 0; 20 } 21 return 1; 22 } 23 void solve(int d){ 24 if(d==9){ 25 print(); 26 return; 27 } 28 for(int i=1;i<=8;i++){ 29 if(check(i,d)){ 30 a[d]=i; 31 solve(d+1); 32 } 33 } 34 } 35 int main(){ 36 solve(1); 37 return 0; 38 }