Untitled
unknown
c_cpp
2 years ago
1.6 kB
8
Indexable
//12604 - N-Queens M-Rooks Problem #include <stdio.h> #include <string.h> int pos[10][2];//pos[位置的列數][是Queen還是Rook] = 位置的行數 int n, m; int valid(int row, int level, int type){ if(level - 1 < 0) return 1; for(int i = level-1; i >= 0; i--){ for(int j = 1; j <= 2; j++){//1代表Queen 2代表Rook if(pos[i][j] != -1){//這一列的旗子是第j類 if(j == 1 || (j == 2 && type == 1)){ if(pos[i][j] == row) return 0; if(pos[i][j] - row == level - i) return 0; if(row - pos[i][j] == level - i) return 0; } else if(j == 2){ if(pos[i][j] == row) return 0; } } } } return 1; } int solve(int q, int r, int level){ int ans = 0; if(level == n+m) return 1; for(int i = 0; i < n+m; i++){ if(valid(i, level, 1)){ if(q-1 >= 0){ pos[level][1] = i; ans += solve(q-1, r, level+1); pos[level][1] = -1; } } if(valid(i, level, 2)){ if(r-1 >= 0){ pos[level][2] = i; ans += solve(q, r-1, level+1); pos[level][2] = -1; } } } return ans; } int main(){ while(scanf("%d%d", &n, &m) != EOF){ memset(pos, -1, sizeof(pos));//上面沒有旗子時狀態為-1 printf("%d\n", solve(n, m, 0)); } }
Editor is loading...