(回溯1)八皇后

描述
在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。即任意两个皇后都不能处于同一行、同一列或同一斜线上
输入
无输入。
输出
按给定顺序和格式输出所有八皇后问题的解(见Sample Output)。
样例输入
样例输出
No. 1
1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0
No. 2
1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 1 0 0 0 0 0
No. 3
1 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1
0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0
0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0
No. 4
1 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0
0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0
No. 5
0 0 0 0 0 1 0 0
1 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0
No. 6
0 0 0 1 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 1 0 0 0 0 0
0 0 0 0 0 1 0 0
No. 7
0 0 0 0 1 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 0 1 0 0 0 0
0 1 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 1 0 0 0 0 0
0 0 0 0 0 1 0 0
No. 8
0 0 1 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
No. 9
0 0 0 0 1 0 0 0
1 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 1 0 0 0 0 0
…以下省略

//1700:八皇后问题
/*
1、首先分析输出样例的顺序
  选第一行,选第二行
  按行的顺序
  说明是指定了列,让我们来填行 
*/ 
#include <iostream>
using namespace std;
//用来存储方案 ,下标都是从1开始 
int a[9][9]; 
int visRow[9]; //行
int visLeftIncline[17];//左斜线 使用的时候 row+column 
int visRightIncline[16]; //右斜线,使用的时候row-column+8 
int ansCount=0;

void init(){

}

void print(){
    cout<<"No. "<<(++ansCount)<<endl;
    for(int i=1;i<=8;i++){
        for(int j=1;j<=8;j++){
            cout<<a[i][j]<<" ";
        }
        cout<<endl;
    }

} 

void search(int column){
    if(column>8){
        //if(ansCount>=5) return;
        print();
        //cout<< ansCount<<endl;
    }
    else{
        for(int row=1;row<=8;row++){
            if(!visRow[row]&&!visLeftIncline[row+column]&&!visRightIncline[row-column+8]){
                visRow[row]=1;
                visLeftIncline[row+column]=1;
                visRightIncline[row-column+8]=1;
                a[row][column]=1;
                search(column+1);//找下一列
                //回溯 
                visRow[row]=0;
                visLeftIncline[row+column]=0;
                visRightIncline[row-column+8]=0;
                a[row][column]=0; 
            }
        }
    }
}

int main(){
    init(); 
    search(1);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40828914/article/details/80674503