ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

回溯法-N皇后问题-C++算法

2022-04-11 10:02:40  阅读:169  来源: 互联网

标签:int pos C++ 同列 算法 num 回溯 皇后


  • N皇后问题要求:

                  在一个N×N的矩阵中,任意两个皇后不能同行、不能同列或不能位于同一条对角线上。


  • 算法思路:

                  按照每一行对单个皇后位置进行遍历,此时限制条件转变为了不能同列或不能位于同一条对角线。

                  以此为限制条件实现回溯,当满足达到最后一行时输出当前结果。


  • 代码实现:
#include <iostream>

using namespace std;

void Select(int **pos, int n, int num);

int main (){
    int num;          //皇后数
    cin >> num;
    int **pos;        //皇后摆放矩阵
    pos = new int *[num];
    for(int i =0; i<num; i++){
        pos[i] = new int [num];
        for(int j =0; j<num; j++)
            pos[i][j]= 0;
    }
    Select(pos,1,num);
}

void Select(int **pos, int n, int num){
    if(n<=num){
        for(int i = 0; i<num; i++){  //每一行进行遍历
            bool flag = false;
            for(int j = 1; j<n; j++){
                if(pos[n-1-j][i] || ((i-j>=0)&&(pos[n-1-j][i-j])) ||  (i+j<num)&&(pos[n-1-j][i+j])){         //回溯条件,判断同一列 ||左上方 ||右上方                         
                    flag = true;
                    break;
                }       
            }
            if(!flag && n==num){        //最后一行输出结果
                pos[n-1][i] = 1;
                for(int i = 0; i<num; i++){
                    for(int j = 0; j<num; j++){
                        cout << pos[i][j] << "  ";
                    }
                    cout <<endl;
                }
                cout <<endl;
                pos[n-1][i] = 0;
                return;
            }
            if(!flag && n<num){          //无冲突判断下一皇后
                pos[n-1][i] = 1;
                Select(pos,n+1,num);
                pos[n-1][i] = 0;
            }
        }
    }
}

 

标签:int,pos,C++,同列,算法,num,回溯,皇后
来源: https://www.cnblogs.com/LazyArtizan/p/16128720.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有