---
# System prepended metadata

title: 12604 - N-Queens M-Rooks Problem
tags: [NTHUOJ]

---

# 12604 - N-Queens M-Rooks Problem
## 題解:
DFS
先找可以放的位置g[i][j] == 0，之後將它可吃到地方加一，
在放皇后的時候要考慮到對角線是否有城堡。
## Code:
```c=1
#include <stdio.h>
#include <string.h>
#define N 10

int n, m, size, ans;
int g[N][N]; // chessboard

void dfs(int row, int numQ, int numR){
    if(row == size){
        ans++;
        return;
    }
    for(int col=0; col<size; col++){
        if(g[row][col]) continue;
        for(int i=row+1; i<size; i++)
            g[i][col]++;
        // queens
        if(numQ < n){
            // check diagonal
            int flag = 1;
            for(int i=row-1, j=col-1; i>=0 && j>=0; i--, j--)
                if(g[i][j] == -1) flag = 0;
            for(int i=row-1, j=col+1; i>=0 && j<size; i--, j++)
                if(g[i][j] == -1) flag = 0;
            if(flag){
                for(int i=row+1, j=col-1; i<size && j>=0; i++, j--)
                    g[i][j]++;
                for(int i=row+1, j=col+1; i<size && j<size; i++, j++)
                    g[i][j]++;
                dfs(row+1, numQ+1, numR);
                for(int i=row+1, j=col-1; i<size && j>=0; i++, j--)
                    g[i][j]--;
                for(int i=row+1, j=col+1; i<size && j<size; i++, j++)
                    g[i][j]--;
            }
        }
        // rooks
        if(numR < m){
            g[row][col] = -1;
            dfs(row+1, numQ, numR+1);
            g[row][col] = 0;
        }
        for(int i=row+1; i<size; i++)
            g[i][col]--;
    }
}

int main(){
    while(scanf("%d%d", &n, &m) != EOF){
        size = n + m, ans = 0;
        memset(g, 0, sizeof(g));
        dfs(0, 0, 0);
        printf("%d\n", ans);
    }
    return 0;
}
```
###### tags: `NTHUOJ`