1. 程式人生 > >【NOJ1007】【演算法實驗二】【回溯演算法】八皇后問題

【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;
    }
}