SGU 224.Little Queens
时间限制:0.75s
空间限制:6M
题意
n*n(n<=10)的棋盘,求出放置m(m<=n*n)个皇后的方案数。
Solution:
状态压缩+位运算 搜索。
首先我们从上往下逐行放置,
DFS(line, row, l, r, k)
line :当前行号
row:列状态
l:\ 左上对角线状态
r:/右上对角线状态
k:已放置棋子数
对于每一行有不放或者放一个棋子两种方案
放一个棋子时又要考虑哪些位置可以放置,
状态压缩(row,r,l):
例如当n=4时
二进制数
1=(0001)2代表在第一个位置放置了棋子
同理(1111) 代表已经放满;
可放状态(pos):
15=(1111)代表全部位置可放
1=(0001) 代表右边第一个位置可放
0=(0000)代表无法再放
对(pos=~(l | row | r)) pos得到当前行所有可放置的位置(可以自己模拟一下)
数状数组中出现的 p= pos& - pos 得到最后一个1 的位置,即一个可放位置。
状态(row,l,r )| p 时,即更新当前行放置后的三个状态
例如 p=1(0001),当前放右一;
row=8(1000),左一已不可放。
row=p | row=9(1001), 即右一和左一都不可以再放
当line+1,即搜索下一行时,l和r变化
以左上对角线状态l为例
初始为(0000)
当右2放置1个棋子时,当前行(0010)
由于是左上对角线,下一行l变为(0001),即 l>>1;
r同理,即r<<1.
row列状态在行变化的时候不需要更新
代码
60ms+2KB Accepted
#include <cstdio>
int n, sum, max, k, m;
void dfs (int line , int row, int l, int r, int k) {
int pos, p, i;
if (line > n){
if(k == m) sum++;
return;
}
dfs (line + 1, row, l>>1, r<<1, k);
if (row != max) {
pos = max & (~ (row | l | r) );
while (pos != 0) {
p = pos & -pos;
pos = pos - p;
dfs (line+1,row | p, (l | p) >> 1, (r | p) << 1, k + 1);
}
}
}
int main() {
scanf ("%d %d", &n, &m);
max = (1 << n) - 1;
dfs (1, 0, 0, 0, 0);
printf ("%d", sum);
}
SGU 224.Little Queens的更多相关文章
- 今日SGU 5.26
#include<bits/stdc++.h> #define de(x) cout<<#x<<"="<<x<<endl ...
- Android Weekly Notes Issue #224
Android Weekly Issue #224 September 25th, 2016 Android Weekly Issue #224 本期内容包括: Google Play的pre-lau ...
- SGU 495. Kids and Prizes
水概率....SGU里难得的水题.... 495. Kids and Prizes Time limit per test: 0.5 second(s)Memory limit: 262144 kil ...
- ACM: SGU 101 Domino- 欧拉回路-并查集
sgu 101 - Domino Time Limit:250MS Memory Limit:4096KB 64bit IO Format:%I64d & %I64u Desc ...
- 【SGU】495. Kids and Prizes
http://acm.sgu.ru/problem.php?contest=0&problem=495 题意:N个箱子M个人,初始N个箱子都有一个礼物,M个人依次等概率取一个箱子,如果有礼物则 ...
- SGU 455 Sequence analysis(Cycle detection,floyd判圈算法)
题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=455 Due to the slow 'mod' and 'div' operati ...
- SGU 422 Fast Typing(概率DP)
题目大意 某人在打字机上打一个字符串,给出了他打每个字符出错的概率 q[i]. 打一个字符需要单位1的时间,删除一个字符也需要单位1的时间.在任意时刻,他可以花 t 的时间检查整个打出来的字符串,并且 ...
- Jeff Somers's N Queens Solutions 最快的n皇后算法
/* Jeff Somers * * Copyright (c) 2002 * * jsomers@alumni.williams.edu * or * allagash98@yahoo.com * ...
- sgu 104 Little shop of flowers 解题报告及测试数据
104. Little shop of flowers time limit per test: 0.25 sec. memory limit per test: 4096 KB 问题: 你想要将你的 ...
随机推荐
- Google Map API 学习三
- HDU-1225 Football Score
http://acm.hdu.edu.cn/showproblem.php?pid=1225 一道超级简单的题,就因为我忘记写return,就wa好久,拜托我自己细心一点. 学习的地方:不过怎么查找字 ...
- 解决外部机器通过VM内ubuntu IP 无法访问vm内web服务的问题
1. 2.i root@ubuntu:/home/udapeng# ifconfig root@ubuntu:/www/sentry# nano uwsgi.ini root@ubuntu:/www/ ...
- 网络编程——TCP协议的三次握手和四次挥手
三次握手原理解析 TCP握手协议在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND ...
- QT静态链接
想把QT的程序链接成一个独立的EXE以方便使用,查了很多资料都需要自行编译QT. 搜索了很多的资料,发篇写得比较简明一些:http://my.oschina.net/weiweiqiao/blog/2 ...
- [置顶] [MATLAB技术贴]漫谈MATLAB矩阵转置
矩阵转置是matlab最基本的操作了,但这个基本操作,也是很多初学者容易出现问题的地方.本帖通过几个实例演示matlab矩阵转置的操作. 方法一:' 运算符与 .' 运算符 >>a ...
- linux 监控命令
先总结下常用的一些监控工具: ##linux命令 w 系统负载 lsof -p pid 进程打开的文件 lsof -i:port 端口的运行情况 free -m 内存情况 vmstat 进程.内存.内 ...
- 面试题 php随机获取概率结果
题目:随机输出“苹果”,“橘子”,“香蕉”要求输出“苹果”的概率为50%,“橘子”的概率为30%,“香蕉”的概率为20% 分析 方案一: 最常用rand(1,10)来处理 如果是5以下的输出苹果 6到 ...
- request和response的中文乱码问题
request乱码指的是:浏览器向服务器发送的请求参数中包含中文字符,服务器获取到的请求参数的值是乱码: response乱码指的是:服务器向浏览器发送的数据包含中文字符,浏览器中显示的是乱码: ...
- 从注冊流程 分析怎样安全退出多个Activity 多种方式(附DEMO)
前言 因为一个同学问到我怎样依照一个流程走好之后回到首页.我曾经看到过4个解决方式,后来发现有做个记录和总结的必要,就写了这篇博文. (之前看小强也写过一篇,这里通过自身的分析完整的总结一下下面6种方 ...