1. 程式人生 > 其它 >回溯法-N皇后問題-C++演算法

回溯法-N皇后問題-C++演算法

  • N皇后問題要求:

                  在一個N×N的矩陣中,任意兩個皇后不能同行、不能同列或不能位於同一條對角線上。


  • 演算法思路:

                  按照每一行對單個皇后位置進行遍歷,此時限制條件轉變為了不能同列或不能位於同一條對角線。

                  以此為限制條件實現回溯,當滿足達到最後一行時輸出當前結果。


  • 程式碼實現:
#include <iostream>

using namespace std;

void Select(int **pos, int n, int num);

int main (){
    int num;          //皇后數
    cin >> num;
    int **pos;        //皇后擺放矩陣
    pos = new int *[num];
    for(int i =0; i<num; i++){
        pos[i] = new int [num];
        for(int j =0; j<num; j++)
            pos[i][j]= 0;
    }
    Select(pos,1,num);
}

void Select(int **pos, int n, int num){
    if(n<=num){
        for(int i = 0; i<num; i++){  //每一行進行遍歷
            bool flag = false;
            for(int j = 1; j<n; j++){
                if(pos[n-1-j][i] || ((i-j>=0)&&(pos[n-1-j][i-j])) ||  (i+j<num)&&(pos[n-1-j][i+j])){         //回溯條件,判斷同一列 ||左上方 ||右上方                         
                    flag = true;
                    break;
                }       
            }
            if(!flag && n==num){        //最後一行輸出結果
                pos[n-1][i] = 1;
                for(int i = 0; i<num; i++){
                    for(int j = 0; j<num; j++){
                        cout << pos[i][j] << "  ";
                    }
                    cout <<endl;
                }
                cout <<endl;
                pos[n-1][i] = 0;
                return;
            }
            if(!flag && n<num){          //無衝突判斷下一皇后
                pos[n-1][i] = 1;
                Select(pos,n+1,num);
                pos[n-1][i] = 0;
            }
        }
    }
}