我的思路是由第一行找到最後一行,每一行中如果可以有可以放皇后或城堡的位置,就繼續進行,直到最後一行,如果皇后與城堡的數量都正確則答案加一
請好心大神再幫我檢查哪裏算出重複答案
#include <stdio.h>
#include <stdlib.h>
#define MAX 10
int m, n;
int size;
int answer = 0;
int col[MAX], diag1[2 * MAX], diag2[2 * MAX];
void findAnswer(int depth, int queen, int castle)
{
if (depth == size){
if (queen == m && castle == n){
answer++;
return;
}
return;
}
if ((size - depth) < (m - queen + n - castle)) {
return;
}
for (int i = 0; i < size; i++){
if (col[i] || diag1[depth + i] || diag2[depth - i + size])
continue;
if (queen < m){
col[i] = diag1[depth + i] = diag2[depth - i + size] = 1;
findAnswer(depth + 1, queen + 1, castle);
col[i] = diag1[depth + i] = diag2[depth - i + size] = 0;
}
if (castle < n){
col[i] = 1;
findAnswer(depth + 1, queen, castle + 1);
col[i] = 0;
}
}
return;
}
int main(void)
{
scanf("%d%d", &m, &n);
size = m + n;
findAnswer(0, 0, 0);
printf("%d\n", answer);
return 0;
}