////M queens N castles
#include <stdio.h>
void put(int row, int m, int n);
int map[20][20]={0}, M, N;
int num_solution = 0;
int safeforqueen(int row,int col);
int safeforcastle(int row, int col);
int main(void){
put(0, 0, 0);
return 0;
}
void put(int row, int m, int n){
int col;
if(row == M+N){
num_solution ++;
}
else{
for(col = 0; col < M+N; col++){
if(m < M && safeforqueen(row, col)){
map[row][col] = 1;
put(row+1, m+1, n);
map[row][col] = 0;
}
if(n < N && safeforcastle(row, col)){
map[row][col] = 2;
put(row+1, m, n+1);
map[row][col] = 0;
}
}
}
}
int safeforqueen(int row, int col){
int r, c;
for(r= 0; r < row; r++){
if(map[r][col]) return 0;
}
for(r = row-1, c = col + 1; r >=0 && c < M+N; r--, c++){
if(map[r][c]) return 0;
}
for(r = row-1, c = col-1; r>= 0 && c >= 0; r--, c--){
if(map[r][c]) return 0;
}
return 1;
}
int safeforcastle(int row, int col){
int r, c;
for(r= 0; r < row; r++){
if(map[r][col]) return 0;
}
for(r = row-1, c = col - 1; r >=0 && c>=0; r--, c--){
if(map[r][c]==1) return 0;
}
for(r = row-1, c = col+1; r>= 0 && c < M+N; r--, c++){
if(map[r][c]==1) return 0;
}
return 1;
}
Ly8vL00gcXVlZW5zIE4gY2FzdGxlcwojaW5jbHVkZSA8c3RkaW8uaD4Kdm9pZCBwdXQoaW50IHJvdywgaW50IG0sIGludCBuKTsKaW50IG1hcFsyMF1bMjBdPXswfSwgTSwgTjsKaW50IG51bV9zb2x1dGlvbiA9IDA7CmludCBzYWZlZm9ycXVlZW4oaW50IHJvdyxpbnQgY29sKTsKaW50IHNhZmVmb3JjYXN0bGUoaW50IHJvdywgaW50IGNvbCk7CgppbnQgbWFpbih2b2lkKXsKICAgIHNjYW5mKCIlZCAlZCIsICZNLCAmTik7CiAgICBwdXQoMCwgMCwgMCk7CiAgICBwcmludGYoIiVkXG4iLCBudW1fc29sdXRpb24pOwogICAgcmV0dXJuIDA7Cn0KCnZvaWQgcHV0KGludCByb3csIGludCBtLCBpbnQgbil7CiAgICBpbnQgY29sOwogICAgaWYocm93ID09IE0rTil7CiAgICAgICAgbnVtX3NvbHV0aW9uICsrOwogICAgfQogICAgZWxzZXsKICAgICAgICBmb3IoY29sID0gMDsgY29sIDwgTStOOyBjb2wrKyl7CiAgICAgICAgICAgIGlmKG0gPCBNICYmIHNhZmVmb3JxdWVlbihyb3csIGNvbCkpewogICAgICAgICAgICAgICAgbWFwW3Jvd11bY29sXSA9IDE7CiAgICAgICAgICAgICAgICBwdXQocm93KzEsIG0rMSwgbik7CiAgICAgICAgICAgICAgICBtYXBbcm93XVtjb2xdID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgaWYobiA8IE4gJiYgc2FmZWZvcmNhc3RsZShyb3csIGNvbCkpewogICAgICAgICAgICAgICAgbWFwW3Jvd11bY29sXSA9IDI7CiAgICAgICAgICAgICAgICBwdXQocm93KzEsIG0sIG4rMSk7CiAgICAgICAgICAgICAgICBtYXBbcm93XVtjb2xdID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKaW50IHNhZmVmb3JxdWVlbihpbnQgcm93LCBpbnQgY29sKXsKICAgIGludCByLCBjOwogICAgZm9yKHI9IDA7IHIgPCByb3c7IHIrKyl7CiAgICAgICAgaWYobWFwW3JdW2NvbF0pIHJldHVybiAwOwogICAgfQogICAgZm9yKHIgPSByb3ctMSwgYyA9IGNvbCArIDE7IHIgPj0wICYmIGMgPCBNK047IHItLSwgYysrKXsKICAgICAgICBpZihtYXBbcl1bY10pIHJldHVybiAwOwogICAgfQogICAgZm9yKHIgPSByb3ctMSwgYyA9IGNvbC0xOyByPj0gMCAmJiBjID49IDA7IHItLSwgYy0tKXsKICAgICAgICBpZihtYXBbcl1bY10pIHJldHVybiAwOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCmludCBzYWZlZm9yY2FzdGxlKGludCByb3csIGludCBjb2wpewogICAgaW50IHIsIGM7CiAgICBmb3Iocj0gMDsgciA8IHJvdzsgcisrKXsKICAgICAgICBpZihtYXBbcl1bY29sXSkgcmV0dXJuIDA7CiAgICB9CiAgICBmb3IociA9IHJvdy0xLCBjID0gY29sIC0gMTsgciA+PTAgJiYgYz49MDsgci0tLCBjLS0pewogICAgICAgIGlmKG1hcFtyXVtjXT09MSkgcmV0dXJuIDA7CiAgICB9CiAgICBmb3IociA9IHJvdy0xLCBjID0gY29sKzE7IHI+PSAwICYmIGMgPCBNK047IHItLSwgYysrKXsKICAgICAgICBpZihtYXBbcl1bY109PTEpIHJldHVybiAwOwogICAgfQogICAgcmV0dXJuIDE7Cn0=