#49901: 請教如何去除重複計算的答案


happydavid2006214@gmail.com (567ouo)

學校 : 國立臺灣大學
編號 : 311504
來源 : [140.112.16.175]
最後登入時間 :
2025-07-31 13:27:30

我的思路是由第一行找到最後一行,每一行中如果可以有可以放皇后或城堡的位置,就繼續進行,直到最後一行,如果皇后與城堡的數量都正確則答案加一

請好心大神再幫我檢查哪裏算出重複答案

#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;
}