|
//8皇后问题,在一个国际象棋棋盘上(估计是8*8)要摆上8个皇后,
//限制条件是,在每个已摆放的位置的同行,同列,斜线方向不能有皇后!
//我得问题是:执行到queen(5)就不循环了!大家可以复制,编译一下!
//多谢!,复制即可用!格式已经可用!
#include<iostream>
using namespace std;
int A[8][8];
int i,j,a,b,c,n=0;//前示定义
int just(int p,int q) {//判断当前位置可否方放皇后
int temp1=p;int temp2=q; //temp1,temp2用于保存传递过来的的行和列的值
//__________________________________
for (;p>=0;p--){
if(A[p][q]==1) {a=0;break;}
}
if(p==-1){a=1;}
//__________________________________以上为判断当前位置的同列有无皇后,a=1代表无皇后
p=temp1; q=temp2;
for ( ;p>=0&&q>=0;p--,q--) {
if(A[p][q]==1) {b=0;break;}
}
if(p==-1||q==-1) {b=1;}
//----------------------以上为判断左斜上方有无皇后,b=1代表无皇后
p=temp1;q=temp2;
for(;p>=0&&q<8;p--,q++) {
if(A[p][q]==1) {c=0;break;}
}
if(p==-1||q==8) {c=1;}
cout<<a<<b<<c<<endl;
//_____________________________________以上为判断右斜上方有无皇后,c=1代表无皇后
if (a&&b&&c) {return 1;}//当abc同时为1时,说明当前位置可以放,just()值为1;
else{return 0;}//否这返回0,just()值为0;
}
void printf() {n++;//printf()用于输出数组,以为我设置为,每找到一个合理排放就输出一次,所以n
for(int m=0;m<8;m++) {//代表一共有多少次合理排放
for(int l=0;l<8;l++){
if(l%8==0){cout<<"\n";}
cout<<A[m][l];}
}
}
void queen(int k) {//递归函数,queen(k)表示在第k行一个合理的位置,放第k个皇后,
if (k==7) {
for (j=0;j<8;j++) {
if (just(k,j)) {
A[k][j]==1;
printf();//当递归到最后一行,并且找到合理位置,输出这个排放
for(int d=0;d<8;d++)//清空当前第k行,执行for,在第7行找下一个合理函数
A[k][d]=0;//(其实我得本意是想在执行for找第j+1个位置的时候,清空A[7][j]的
} //可是确定不了这个位置,但知道一定在这个行里,所以全给清了。
}
}
else{//不是最后一行的话,在当前行找可放第k个皇后的位置,找到则执行queen(k+1),
//找不到则执行for循环,当当前行没有合理的位置的时候,返回到上一次的queen(即上一行中)
//执行上一行没完成的for循环,找的A[K][j+1]看看合适不?同时要把A[k][j]清零,防止影响本次判断(不过大家看我得清零对不对)
for (j=0;j<8;j++){
if(just(k,j)) {//判断这个位置合理不
A[k][j]=1;
queen (k+1);//如果合理则在这个位置上放上1,表示第k个皇后已经有位置了,执行queen(k+1)
}
for(int d=0;d<8;d++){ A[k][d]=0;}//呵呵。这次清零还是清的全部行,笨了,因为还是确定不了这个行的哪个位置已经有皇后
}
}
return;}
int main() {
for(int i=0;i<8;i++) {//创建一个8*8数组,全部赋值为零
for (int j=0;j<8;j++) {
A[j]=0;}
}
queen(0);//从数组的第一行开始找的一个皇后的位置,自然就开始了递归!
cout<<endl<<"there are "<<n<<" times"<<endl;//找到多少个合理排放
cout<<"=====complete=====";
} |
|