刷清橙OJ--A1085.2n皇后问题

来源:互联网 发布:java hash算法 编辑:程序博客网 时间:2024/06/15 00:28
问题:
A1085. 2n皇后问题
时间限制:1.0s   内存限制:512.0MB  
总提交次数:2937   AC次数:1111   平均分:52.38
问题描述
  给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。
输入格式
  输入的第一行为一个整数n,表示棋盘的大小。
  接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。
输出格式
  输出一个整数,表示总共有多少种放法。
样例输入
4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
样例输出
2
样例输入
4
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1
样例输出
0
代码:
#include <cstdio> #include <cstring> #include <cstdlib> using namespace std; int n, k = 0; bool lb[20], lw[20], rb[20], rw[20], hb[10], hw[10], mp[10][10]; void se(int p) {     if(p > n){++k; return;}     for(int i = 1; i <= n; ++i)       if(mp[p][i] && hb[i] && lb[p - i + n] && rb[p + i]){         hb[i] = lb[p - i + n] = rb[p + i] = false;         for(int t = 1; t <= n; ++t)           if(mp[p][t] && hw[t] && lw[p - t +n] && rw[p + t] && i != t){           hw[t] = lw[p - t + n] = rw[p + t] = false;           se(p+1);           hw[t] = lw[p - t + n] = rw[p + t] = true;         }         hb[i] = lb[p - i + n] = rb[p + i] = true;       }       }  int main() {     memset(lb,true,sizeof(lb));     memset(lw,true,sizeof(lw));     memset(rb,true,sizeof(rb));     memset(rw,true,sizeof(rw));     memset(hb,true,sizeof(hb));     memset(hw,true,sizeof(hw));     scanf("%d",&n);     for(int i = 1; i <= n; ++i)         for(int t = 1; t<= n; ++t)             scanf("%d",&mp[i][t]);     se(1);     printf("%d",k);     return 0; } 

个人想法:代码来自试题讨论