八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线(对角线)上,问有多少种摆法。
主要思路:一行一行得摆放皇后,直到第7行(作为递归结束条件)。初始状态从第0行开始摆放,利用递归(深度搜索)去搜索所有情况,最后求得解。
#include<bits/stdc++.h>
using namespace std;
int sum = 0;
/*
一行一行摆放皇后, 利用深度搜索(回溯发)列举所有情况
*/
int chess[8][8];
//判断当前位置是否可以摆放
bool can_place(int row, int col){
int r, c;
//横方向
for(int i = 0;i < 8;i++){
if(chess[row][i] == 1){
return false;
}
}
//竖方向
for(int i = 0;i < 8;i++){
if(chess[i][col] == 1){
return false;
}
}
//左上斜方向
r = row;
c = col;
while(--r >= 0 && --c >= 0){
if(chess[r][c] == 1){
return false;
}
}
//右下斜方向
r = row;
c = col;
while(++r < 8 &&