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也就是遍历到最后一行为止。

 

posted @ 2022-01-29 16:24  prize  阅读(16)  评论(0编辑  收藏  举报