【题目描述】

  众所不知,rly现在不会玩国际象棋。但是,作为一个OIer,rly当然做过八皇后问题.在这里再啰嗦几句,皇后可以攻击到同行同列同对角线,在

n*n的棋盘中,摆放n个皇后使它们互相不能攻击到,求不同的解的数量,这就是经典的n皇后问题。现在问题推广n皇后问题,这个问题对你而言实

在是小菜一碟。但是因为上次rly把棋盘弄破了,又拿不出新的,所以rly打算难一点点,问题就是在破的棋盘上的n皇后问题。他想知道......(你们懂的..)

  妻子都是相同的

【输入说明】

  一行,一个整数N。

  接下来N行,每行N个整数,要么为0,表示没坏,要么为1,表示坏了。

【输出说明】

  一行,输出不同的接的数量。

【样例输入】

  4

  1 0 1 1

  1 1 1 0

  0 1 1 1

  1 1 0 1

【样例输出】

  1

【数据范围】

  对于40%的数据,N<=13。

  对于100%的数据,N<=16。

  对于30%的数据棋盘没有破,你可以认为rly又去买了一个新的。

 /*位运算优化n皇后*/
#include<cstdio>
#include<iostream>
#define N 20
using namespace std;
int hang[N],n,ans;
void dfs(int t,int a,int b,int c)//a,b,c都是二进制数,表示哪一列或对角线是否放过皇后,1为放过
{
if(t==n+)
{
ans++;return;
}
int S=((<<n)-)&(~(hang[t]|a|b|c));
/*
S是一个二进制数,表示当前可以往哪一列放皇后
(hang[t]|a|b|c)表示哪些列从列和对角线的角度来说都放过
加上~(取反),表示哪些列可以放皇后
*/
while(S)
{
int x=S&(-S);//x表示可以当前放皇后的位置
dfs(t+,a+x,(b+x)<<,(c+x)>>);
S-=x;
}
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
int x;scanf("%d",&x);
hang[i]+=x<<(j-);
}
dfs(,,,);
printf("%d",ans);
return ;
}

思路:位运算优化后的n皇后问题

最新文章

  1. 007-Scala类的属性和对象私有字段实战详解
  2. maven引入jar包时,一个jar的引入错误,会导致后来的jar包的引入。
  3. Selenium2+python自动化17-JS处理滚动条
  4. 【BZOJ】【2480】【SPOJ 3105】Mod
  5. [spring-framework]Spring定时器的配置和使用
  6. 在wp中,使用NavigationService.Navigate导航页面出现错误
  7. ios属性和成员变量写在.h文件和.m文件中 区别?
  8. 通过网络得到html,并解析出其中网址(JAVA程序)
  9. java 邮件发送工具类
  10. Mac系统实现git命令自动补全
  11. JAVA_SE基础——53.什么是异常?
  12. 洛谷4月月赛R1
  13. 独立游戏《Purgatory Ashes》的经验与总结
  14. 一天搞懂深度学习-训练深度神经网络(DNN)的要点
  15. elementUi的时间选择器在IE浏览器的赋值问题--前端
  16. tp5 删除服务器文件
  17. hbase 相关
  18. node.js获取请求参数的方法和文件上传
  19. python 爬虫 爬取序列博客文章列表
  20. 每天一点儿Java--ComboBox

热门文章

  1. uva12264 Risk
  2. Html5怎么导出图片
  3. 获得stixel的gt数据
  4. nyoj-47-过河问题|POJ-1700-Crossing River
  5. Linux内核漏洞利用-环境配置(转)
  6. 歌乐第二弹:C++九九八十一
  7. 运用模逆运算(同余方程)来解决Matlab课上的一道思考题
  8. I2C驱动框架(三)
  9. 【实验吧】因缺思汀的绕过&amp;&amp;拐弯抹角&amp;&amp;Forms&amp;&amp;天网管理系统
  10. CodeForces 699C - Vacations