#include<iostream.h> #include<math.h> void EightQueen() { int n; cout<<"输入这个棋盘的大小"<<endl; cin>>n; int queen[n]; int total=0;//计数器 int j,k; for(int r=0;r<n;r++) queen[r]=0;//皇后全放在第0列,要知道这个语句一执行的话,这个棋盘就是存在了,后面的相当于对这个盘进行的修改,不要以为它是个没有满的盘. for(int i=1; ;)//这是个无条件下的循环,判断时当然从第二行作为判断的起点,这个循环是由else 中的return 退出的 { if(queen[i]<8)//列标没有达到最右端,等于7时还要判断,是以这个作为回溯判断 { k=0;//检查与第k个皇后是否互相攻击,这里只是对一个结果的判断而已 while(k<i && (queen[k]-queen[i]) && (abs(queen[k]-queen[i])-abs(k-i))) k++;//同行同列的特点 if(k<=i-1)//若没有攻击,则最后的k要等于i(即对第i个皇后放置后,要从头检查直到i-1个),否则就是小于i { queen[i]++;//第i个皇后就要右移一格,重新开始测试 continue; } i++;//如果是没有冲突的话,就会重新回到循环,要知道第二for语句的int i=1;是不会再执行的,它只是一个初始化而已 if(i<n) {continue;}//还没有到最后一行,就算i=7;这时我们还要测试这一行,i=7时这一行并没有测试它 for(j=0;j<n;j++) {cout<<queen[j];}//若只有一行,这样写的可读性要好 cout<<" "; total++; if(total%3==0) cout<<endl; queen[7]++;//我们说过:i=7时这一行并没有测试它一样,这时虽找到一个,并没有全部测试完 i=7;//这是确保找到一个结果后,顺着它找到同宗同根的结果,当然这个结果数字相同的部分会越来越少 } else { //就会重新回到循环,要知道第二for语句的int i=1;是不会再执行的,它只是一个初始化而已 queen[i]=0;//当前皇后回归到0列 i--;//回溯到前一行皇后 if(i<0) { cout<<"总数:"<<total<<endl; return;//表示连第一行的最后一个位置都不能成立了.再也不能回溯了.由它退出函数 } else queen[i]++;//前一行皇后右移一列 } } }
|