问题描述:
在n*n的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n*n格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线。
盲目的迭代枚举:
1 /* 2 *作者:xymaqingxiang 3 *说明:八皇后——盲目迭代法 4 *分析:通过8重循环模拟搜索空间中的8^8个状态,从中找出满足约束条件的可行性方案 5 *日期:2014-05-15 6 */ 7 #include <iostream> 8 #include <cstdlib> 9 using namespace std; 10 bool place(int a[],int n) 11 { 12 for(int i=2;i<=n;i++) 13 { 14 for(int j=1;j<=i-1;j++) 15 { 16 if ((a[i]==a[j])||(abs(a[i]-a[j])==i-j))//不同列和不同斜线约束 17 { 18 return false;//位置冲突 19 } 20 } 21 } 22 return true;//不冲突 23 } 24 25 void queens() 26 { 27 int a[9]; 28 int count = 0; 29 //每个皇后都从第一列位置开始判断 30 for(a[1]=1;a[1]<=8;a[1]++) 31 { 32 for(a[2]=1;a[2]<=8;a[2]++) 33 { 34 for(a[3]=1;a[3]<=8;a[3]++) 35 { 36 for(a[4]=1;a[4]<=8;a[4]++) 37 { 38 for(a[5]=1;a[5]<=8;a[5]++) 39 { 40 for(a[6]=1;a[6]<=8;a[6]++) 41 { 42 for(a[7]=1;a[7]<=8;a[7]++) 43 { 44 for(a[8]=1;a[8]<=8;a[8]++) 45 { 46 if(!place(a,8)) //判断位置的合法性 47 continue; 48 else 49 { 50 for(int i=1;i<=8;i++) 51 { 52 cout<<a[i]; //打印满足约束的可行性放置方案 53 } 54 cout<<endl; 55 count++; 56 } 57 } 58 } 59 } 60 } 61 } 62 } 63 64 } 65 } 66 cout<<count<<endl; 67 } 68 69 void main() 70 { 71 queens(); 72 system("pause"); 73 }