解題思路
深搜、標記以及回溯
算法詳情
介紹順序:標記->深搜->回溯
1.標記
使用數組記錄無法下棋的部分:
bool flag[4][100];
當置爲1時,即爲無法再放置的標記,具體標記內容:
flag[1][j]=1 //標記j列不能再放置
flag[2][i+j]=1 //標記對角線
flag[3][i-j+n]=1 //標記對角線
舉個例子,當棋盤爲4*4時:
flag[2][i+j]=1// i=2,j=3;顯見在紅線處都應該設爲1
flag[3][i-j+n]=1 // i=2,j=3;顯見在紅線處應都無法放置
2.代碼
#include<iostream>
using namespace std;
int res; bool flag[4][100]; int n;
void dfs(int i) {
int j;
if (i > n) {
res++;
return;
}
for (j = 1; j <= n; j++) {
if ((flag[1][j] == 0) && (flag[2][i + j] == 0) && (flag[3][i - j + n] == 0)) {
flag[1][j] = 1;//標記
flag[2][i + j] = 1;//標記
flag[3][i - j + n] = 1;//標記
dfs(i + 1);
flag[1][j] = 0;//回溯
flag[2][i + j] = 0;//回溯
flag[3][i - j + n] = 0;//回溯
}
}
}
int main() {
cin >> n;
dfs(1);
cout << res;
return 0;
}