回溯法-N皇后問題-C++演算法
阿新 • • 發佈:2022-04-11
- 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; } } } }