N皇后问题
作者:互联网
解释一下:在本题中每个皇后不能在同一行,同一列,同一斜线,否则就会互相攻击。最开始这题是八皇后问题,但是做八皇后第一想法肯定是用暴搜,做八个循环,但是如果是n皇后的话肯定就不能用这个方法了,因为有几个皇后不确定。
代码:
1 #include <iostream> 2 #include <cmath> 3 using namespace std; 4 int n; 5 int queenPos[100];//记录皇后所在的列数 6 void NQueen(int k); 7 int main(){ 8 cin>>N; 9 NQueen(0); 10 return 0; 11 } 12 13 void NQueen (int k){//这个函数是在0~k-1行都摆好的情况下来摆k行以上的 14 int i; 15 if(k == N){//如果k一直遍历到最后一行还能满足条件就把queenpos中的列数打印出来 16 for(i = 0;i<N;i++){ 17 cout<<queenPos[i]+1<<" "; 18 } 19 cout<<endl; 20 return ; 21 } 22 for(i = 0;i<N;i++){//遍历第k行的每一个位置 ,比如这个测试案例就是打印某一行的四个位置 23 int j; 24 for(j = 0;j<k;j++){ 25 //遍历上面的 k- 1行看看会不会冲突 26 if(queenPos[j] == i||abs(queenPos[j]-i)==abs(k-j)){ 27 break; 28 } 29 } 30 //如果前k行都没有发生冲突的话就 继续进行下一行的皇后 31 if(j == k){ 32 queenPos[k] = i; 33 NQueen(k+1); 34 } 35 } 36 }
总结与分析:
这里重点解释一下函数里面的核心代码,首先遍历第k行的每一个位置,接着再把第k行上面的皇后位置遍历(存在queenPos数组里面),如果这个值与i相等说明在同一列,会被吃,如果行差与列差的绝对值相等的话,在同一斜线上,也会被吃。遇到这两种情况的话就break掉。如果没有break也就是j==k的时候,就说明前面的皇后没有与第k行的皇后冲突的,说明她的位置就是在i处,就把这个queenPos【k】存入i这个值。然后再遍历下一行,知道k == N也就是遍历到最后一行为止。
标签:遍历,同一,int,问题,NQueen,queenPos,皇后 来源: https://www.cnblogs.com/chengzhangpeideboke/p/15855332.html