问题:在一个N*N的棋盘上摆放N个“皇后”,且两两不在同一直线和斜线上,求有多少种摆法
解法:使用递归和回溯的思想求解
代码:
#include <iostream>
using namespace std;
const int N = 8;
int map[N][N];
static int methods = 0;
bool put(int pi, int pj){
if (pi == N-1){
methods++;
return false;
}
map[pi][pj] = N;
for (int i = 0; i < N; i++){
for (int j = 0; j < N; j++){
if (i == pi || j == pj || i + j == pi + pj || i - j == pi - pj){
map[i][j]++;
}
}
}
for (int j = 0; j < N; j++){
if (map[pi + 1][j] == 0){
if (put(pi + 1, j) == true){ return true; }
}
}
for (int i = 0; i < N; i++){
for (int j = 0; j < N; j++){
if (i == pi || j == pj || i + j == pi + pj || i - j == pi - pj){
map[i][j]--;
}
}
}
map[pi][pj] = 0;
return false;
}
int main(){
for (int j = 0; j < N; j++){
if (put(0, j) == true){
for (int i = 0; i < N; i++){
for (int j = 0; j < N; j++){
if (map[i][j] == N + 1)
cout << "●";
else
cout << "○";
}
cout << endl;
}
return 1;
}
}
cout << "Kinds of handgrasp:" << methods << endl;
return 0;
}