回溯法—八皇后问题(N皇后)

八皇后问题

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

解题思路:
《回溯法—八皇后问题(N皇后)》
1.在8*8的棋盘上进行逐行试探,每一行进行逐格试探,判断该格是否能放一个皇后,即判断在该格对应的列,左斜线,右斜线上是否有皇后,若有则放,若无,则试探该行的下一个格子。
2.当该行已经放了皇后之后,跳到下一行;
若该行无法放入皇后,则说明之前放皇后的一行,皇后放的有问题,需要重新放,回退到该行放皇后的格子处,对后面的格子进行重新试探;依次类推,直到8行放完后,输出;

#include<iostream>
using namespace std;
int leftt[15]={0};//leftt控制左斜线 
int rightt[15]={0};//rightt控制右斜线 
int col[8]={0};//判断该列是否有皇后 
int Q[8]={0};//下标代表皇后,值代表列号 
int cnt=1;//计算当前为第几组解 
void print(){
    cout<<"第"<<cnt++<<"组解"<<endl;
    for(int i=0;i<8;i++){
        for(int j=0;j<8;j++){
            if(Q[i]==j) cout<<"Q ";
            else cout<<"X ";
        }
        cout<<endl;
    }

}
void Queen(int i){//传入行号 
    if(i==8){
        print();//当i为8时,说明棋盘已经被放满 
    }
    else{
        for(int j=0;j<8;j++){//依次遍历当前行的每一个格子 
            if(!col[j]&&!leftt[i+j]&&!rightt[7+i-j]){//若该格子可以放皇后,则将值改1 
                col[j]=leftt[i+j]=rightt[7+i-j]=1;
                Q[i]=j;//将皇后的位置存入 
                Queen(i+1);//再给下一行放 
                col[j]=leftt[i+j]=rightt[7+i-j]=0;//从上一行退出来后,这说明这一行的皇后的位置不对,故抹去皇后的位置 
            }
        }
    }
}
int main(void){
    Queen(0);
    return 0;
}

就写这么多,如果那里不清楚联系我QQ294177133

    原文作者:回溯法
    原文地址: https://blog.csdn.net/qq_39774870/article/details/78112339
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞