# 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`