题目描述
八皇后问题
是一个古老而著名的问题,是回溯算法的典型案例。
该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出的,在8*8格的国际象棋上摆放八个皇后;使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上;
问有多少种摆法, 输出所有可能的解?
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> using namespace std; const int N=8; int matrix[N][N]={0}; bool coutt(int matrix[N][N]) { static int count = 1; cout<<"Case "<<count++<<":"<<endl; for(int i=0;i<N;i++) { for(int j=0;j<N;j++) { if(matrix[i][j]==1) { cout<<"Q"; } else cout<<"*"; } cout<<endl; } cout<<endl; getchar(); } bool Safety(int matrix[N][N], int row, int col) { for (int i = 0; i < row ; i++) { for (int j = 0; j < N; j++) if(matrix[i][j]==1&&(j==col||abs(row-i)==abs(col-j))) return false; } return true; } void BackTrack(const int i) { if (i >=N) coutt(matrix); else for (int j = 0; j < N; ++j) { matrix[i][j] = 1; if(Safety(matrix,i,j)) BackTrack(i + 1); matrix[i][j] = 0; } } int main() { BackTrack(0); return 0; }