【NOJ1007】【算法实验二】【回溯算法】八皇后问题


1007.8皇后问题

时限:1000ms 内存限制:10000K  总时限:3000ms

描述

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

输入

没有输入。

输出

每个结果第一行是No n:的形式,n表示输出的是第几个结果;

下面8行,每行8个字符,‘A’表示皇后,‘.’表示空格。

不同的结果中,先输出第一个皇后位置靠前的结果;第一个皇后位置相同,先输出第二个皇后位置靠前的结果;依次类推。

输出样例

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


#include <iostream>
#include <cmath>

using namespace std;

int n=8;        //求解8皇后问题
int a[8];       //存放解,a[0]=1代表第0行第1列放置皇后
int cnt=0;      //解的个数

void dfs(int m);        //回溯深搜
bool canmoveto(int m);  //第m行第a[m]列能否放皇后?
void fprint(int cnt);   //打印一组解

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

void dfs(int m)     //进行第m行的放置工作
{
    if(m==n){       //全部8行已放置完毕
        cnt++;
        fprint(cnt);
    }
    else{
        for(a[m]=1;a[m]<=8;a[m]++){ //分别测试放置在m行各列能否成功
            if(canmoveto(m)){
                dfs(m+1);
            }
        }
    }
}

//函数功能:判断第m行第a[m]列能否放皇后
bool canmoveto(int m)
{
    int i;
    for(i=0;i<m;i++){
        if(a[i]==a[m])                  //同列检测
            return false;
        if(abs(i-m)==abs(a[i]-a[m]))    //同斜线检测
            return false;
    }
    return true;
}

//函数功能:打印一组解
void fprint(int cnt)
{
    int i,j;
    cout<<"No "<<cnt<<':'<<endl;
    for(i=0;i<n;i++){
        for(j=1;j<=n;j++){
            if(a[i]==j)
                cout<<'A';
            else
                cout<<'.';
        }
        cout<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41727666/article/details/82912444