2020-11-18 N皇后問題

prvyx發表於2020-11-18

總結:越是因底層知識而出現的bug,越是不容易被發現

//N皇后問題
//以及出現的嚴重問題(bug)(找了半天@.@):27行程式碼 關於int/int的結果會被截斷的問題
//以下在程式碼行加的註釋是為了利用這些程式碼進行測試
#include<iostream>
using namespace std;

void Print_ChessBoard(int** chessboard,int n)//列印棋盤
{
    cout<<"-----------"<<endl;
    for(int i=0;i!=n;i++){
        for(int j=0;j!=n;j++)
            cout<<chessboard[i][j]<<" ";
        cout<<endl;
    }
    cout<<"-----------"<<endl;
}

bool SetIs_OK(int** chessboard,int n,int i,int j)//若座標(i,j)位置可以放置(即放置後不衝突),返回true;
//之前的行下標為0~i-1的棋子已經不相互攻擊,只需滿足座標為(i,j)的棋子與行下標為0~i-1的棋子不相互攻擊即可
{
    for(int i1=0;i1!=i;i1++){
        int j1;
        for(j1=0;j1!=n;j1++){
            if(chessboard[i1][j1]==1)
                break;
        }//迴圈結束後找到行下標為i1的chessboard為1的座標點
        if(j1==j||1.0*(j1-j)/(i1-i)==1||1.0*(j1-j)/(i1-i)==-1)//若互相攻擊,返回false
        //bug※:(j1-j)/(i1-i) 分子、分母均為int,結果會被截斷 eg:4/3返回的結果是1 但這並非你需要的
        //解決方法:乘以1.0,將==左邊變為double型
            return false;
    }
    return true;
}

int sum=0;
void Trail_ChessBoard(int i,int** chessboard,int n)//前i-1行已被處理,現處理第i行
{
//    cout<<"11111111111111"<<endl;
//    Print_ChessBoard(chessboard,n);
//    cout<<"11111111111111"<<endl;
    int j;
    if(i>n){Print_ChessBoard(chessboard,n); sum++;}
    else{
        for(j=0;j!=n;j++){
            if(SetIs_OK(chessboard,n,i-1,j)){
//                cout<<"成功進入遞迴一次\n";
                chessboard[i-1][j]=1;
//                cout<<chessboard[i-1][j]<<endl;
                Trail_ChessBoard(i+1,chessboard,n);
//                cout<<"出一個遞迴\n";
//                cout<<chessboard[i-1][j]<<endl;
                chessboard[i-1][j]=0;
            }
        }
    }
}

int main()
{
    int n;
    cout<<"輸入棋盤的行列數:";
    cin>>n;
    int** chessboard=new int*[n];
    for(int i=0;i!=n;i++)
        chessboard[i]=new int[n];
    for(int i=0;i!=n;i++){
        for(int j=0;j!=n;j++)
            chessboard[i][j]=0;
    }
    Trail_ChessBoard(1,chessboard,n);
    cout<<"sum="<<sum<<endl;
    return 0;
}

輸入棋盤的行列數:5
-----------
1 0 0 0 0
0 0 1 0 0
0 0 0 0 1
0 1 0 0 0
0 0 0 1 0
-----------
-----------
1 0 0 0 0
0 0 0 1 0
0 1 0 0 0
0 0 0 0 1
0 0 1 0 0
-----------
-----------
0 1 0 0 0
0 0 0 1 0
1 0 0 0 0
0 0 1 0 0
0 0 0 0 1
-----------
-----------
0 1 0 0 0
0 0 0 0 1
0 0 1 0 0
1 0 0 0 0
0 0 0 1 0
-----------
-----------
0 0 1 0 0
1 0 0 0 0
0 0 0 1 0
0 1 0 0 0
0 0 0 0 1
-----------
-----------
0 0 1 0 0
0 0 0 0 1
0 1 0 0 0
0 0 0 1 0
1 0 0 0 0
-----------
-----------
0 0 0 1 0
1 0 0 0 0
0 0 1 0 0
0 0 0 0 1
0 1 0 0 0
-----------
-----------
0 0 0 1 0
0 1 0 0 0
0 0 0 0 1
0 0 1 0 0
1 0 0 0 0
-----------
-----------
0 0 0 0 1
0 1 0 0 0
0 0 0 1 0
1 0 0 0 0
0 0 1 0 0
-----------
-----------
0 0 0 0 1
0 0 1 0 0
1 0 0 0 0
0 0 0 1 0
0 1 0 0 0
-----------
sum=10

Process returned 0 (0x0)   execution time : 0.776 s
Press any key to continue.

相關文章