八皇后问题---暴力求解
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。
#include<iostream> #include<math.h> using namespace std; int main() { //数据说明 /* s用来做判断条件 w用来计数 f[]用来储存数的个数 g[]用来存储具体数 */ int s,i,w,x,k,f[10],g[9]; long a,y; s=0; w=0; cout<<"八皇后问题的解为"<<endl; for(a=12345678;a<=87654321;a=a+9) { y=a; for(i=8;i>=1;i--)//分离数字 { x=y%10;//从末尾开始取 y=y/10; g[i]=x; if(x==0) s=1;//保证有八个棋子 f[x]=f[x]+1;//计数 } //判断 //1.每个皇后不能同行 for(i=0;i<10;i++) if(f[i]>=2) { s=1;break; } //2.皇后不能呈45度 for(i=1;i<8;i++) for(k=i+1;k<=8;k++) { if(fabs(g[i]-g[k])==k-i) { s=1;break;//break要丢在括号里面 } } if(s==0) { cout<<a<<endl; w++;//计数 } //初始化数据 for(i=0;i<10;i++) { f[i]=0; g[i]=0; } s=0; } cout<<w<<endl; return 0; }
总结:
1.关于暴力求解问题,还是要在草稿纸上先把约束条件都大致写出来,免得到时候又去一步步的调试。
2.注意代码风格,不管语句是几行,都把{}打上