N皇后问题的求解(C++代码)

八皇后问题是把八个皇后放到棋盘中,使它们不互相攻击.根据国际象棋的规则,皇后可以吃掉放在和它同行,同列,或同一斜线上的任一棋子.

八皇后求解的核心算法伪代码:

putqueen(row)

for(同一行row上每个位置col)

if 位置col可以放皇后

将下一个皇后放在位置col处

if(row<8)

putqueen(row+1)

else 成功

取走位置col上的皇后

具体代码如下:

 

Code:
  1. #include <iostream>   
  2. using namespace std;   
  3.   
  4. int p[12][12];//初始化棋盘(棋盘太大回溯法的效率很低,所以该题的数据很小)   
  5. int result;   
  6. int n;//棋盘大小   
  7.   
  8. void init(int n)//初始化棋盘   
  9. {   
  10.     for(int i=0;i<n;i++)   
  11.     {   
  12.         for(int j=0;j<n;j++)   
  13.             p[i][j]=0;   
  14.     }   
  15.     result=0;   
  16. }   
  17.   
  18. bool issafe(int row,int col)//判断该位置能否放皇后   
  19. {   
  20.     for(int i=0;i<row;i++)   
  21.     {   
  22.         for(int j=0;j<n;j++)   
  23.         {   
  24.             if(p[i][j]==1)   
  25.             {   
  26.                 //判断同行,同列,对角线上是否有皇后   
  27.                 if(i==row||j==col||(j-i)==(col-row)||(j+i)==(col+row))   
  28.                     return false;   
  29.             }   
  30.         }   
  31.     }   
  32.     return true;   
  33. }   
  34.   
  35. void putqueen(int x)//入皇后   
  36. {   
  37.     for(int y=0;y<n;y++)//遍历该行每个位置   
  38.     {   
  39.         if(issafe(x,y))//如果安全    
  40.         {   
  41.             p[x][y]=1;//则放皇后   
  42.             if(x<n-1)   
  43.                 putqueen(x+1);//如果未到最后一行,在下一行放皇后   
  44.             else  
  45.                 result++;//否则返回,结果加1   
  46.         }   
  47.         {   
  48.             for(int k=0;k<n;k++)//该步骤很重要,拿走该行上的皇后   
  49.             p[x][k]=0;   
  50.         }   
  51.     }   
  52. }   
  53.            
  54.   
  55. int main()   
  56. {   
  57.   
  58.     while(cin>>n)   
  59.     {   
  60.         init(n);   
  61.         putqueen(0);   
  62.         cout<<result<<endl;   
  63.     }   
  64.     return 0;   
  65. }  

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
n皇后问题是一道经典的回溯算法问题,以下是C++的实现代码: ``` #include <iostream> #include <vector> using namespace std; // 判断当前位置是否可以放置皇后 bool is_valid(vector<int>& queens, int row, int col) { for(int i = 0; i < row; i++) { if(queens[i] == col || abs(row - i) == abs(col - queens[i])) { return false; } } return true; } // 递归回溯求解n皇后问题 void backtrack(vector<vector<string>>& res, vector<int>& queens, int row, int n) { if(row == n) { vector<string> solution(n, string(n, '.')); for(int i = 0; i < n; i++) { solution[i][queens[i]] = 'Q'; } res.push_back(solution); } else { for(int col = 0; col < n; col++) { if(is_valid(queens, row, col)) { queens[row] = col; backtrack(res, queens, row + 1, n); queens[row] = -1; } } } } vector<vector<string>> solveNQueens(int n) { vector<vector<string>> res; vector<int> queens(n, -1); backtrack(res, queens, 0, n); return res; } int main() { int n = 4; vector<vector<string>> res = solveNQueens(n); for(int i = 0; i < res.size(); i++) { for(int j = 0; j < res[i].size(); j++) { cout << res[i][j] << endl; } cout << endl; } return 0; } ``` 代码思路: 1. 递归函数 backtrack 用于求解 n 皇后问题,参数 res 表示最终结果,queens 表示每一行皇后所在的列号,row 表示当前处理的行号,n 表示总行数。 2. 判断当前位置是否可以放置皇后的函数 is_valid,用于判断当前位置是否会受到之前皇后的攻击,如果是则返回 false。 3. 在 backtrack 函数中,先判断是否已经处理完了所有行,如果是则将结果加入到 res 中,否则枚举当前行的所有列,如果当前位置可以放置皇后,则继续处理下一行。 4. 主函数中调用 solveNQueens 函数求解 n 皇后问题,并输出结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值