noj算法 8皇后打印 回溯法

描述:

输出8皇后问题所有结果。

输入:

没有输入。

输出:

每个结果第一行是No n:的形式,n表示输出的是第几个结果;下面8行,每行8个字符,‘A’表示皇后,‘.’表示空格。不同的结果中,先输出第一个皇后位置靠前的结果;第一个皇后位置相同,先输出第二个皇后位置靠前的结果;依次类推。

输入样例:

 

输出样例:

输出的前几行:
No 1:
A.......
....A...
.......A
.....A..
..A.....
......A.
.A......
...A....
No 2:
A.......
.....A..
.......A
..A.....
......A.
...A....
.A......
....A...

 

题解:

       定义一个数组 c[ ] 用来存放第i行对应的是第j列,判断每一行哪个位置能放,能放就继续搜索下去,不能就回溯。

 

代码:

#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;
int k=1,c[8],a[8][8];
bool isok(int row)
{
    for(int j=0;j!=row;j++){
        if(c[row]==c[j]||row-c[row]==j-c[j]||row+c[row]==j+c[j])
            return false;
    }
    return true;
}

void queen(int row)
{
    if(row==8){
        printf("No %d:
",k++);
        for(int i=0;i<8;i++){
            for(int j=0;j<8;j++){
                if(a[i][j]==1) cout<<'A';
                else cout<<'.';
            }
            cout<<endl;
        }
    }
    else
    {
        for(int col=0;col!=8;col++){
            c[row]=col;
            if(isok(row))
                {a[row][col]=1; queen(row+1);a[row][col]=0;}
        }
    }
}

int main()
{
    queen(0);
    return 0;
}

 

原文地址:https://www.cnblogs.com/y1040511302/p/9733381.html