lightoj 1061 - N Queen Again(状压dp)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1061
题解:显然能满足情况的8皇后的摆法不多,于是便可以用题目给出的状态来匹配各种满足情况的摆法然后找出最小值。还有关于题目的一个条件,皇后之间的移动不能越过皇后之间,其实这个条件并没什么用,因为如果某一个皇后挡住了另一个皇后的移动那么这种摆放方式肯定是不符合的那么肯定要移动某一个所以只要先移动挡住位置的皇后就行。所以得到了两个位置之间移动所需的花费,要么0要么1要么2。然后就是怎么匹配的问题,这个可以用状压来解决。设dp[i][j]表示处理到第i行,j表示取数的状态。然后就是简单的转移,具体看一下代码。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#define inf 0X3f3f3f3f
using namespace std;
struct TnT {
int x , y;
}node[10] , aim[10];
char mmp[10][10];
int ans , tm[10][10] , dp[10][1 << 10];
bool vis_col[10] , vis_l[20] , vis_r[20];
int getlen(int i , int j) {
if(node[i].x == aim[j].x && node[i].y == aim[j].y) return 0;
if(node[i].x == aim[j].x && node[i].y != aim[j].y) return 1;
if(node[i].x != aim[j].x && node[i].y == aim[j].y) return 1;
if(abs(node[i].x - aim[j].x) == abs(node[i].y - aim[j].y)) return 1;
return 2;
}
void solve() {
for(int i = 0 ; i < 8 ; i++) {
for(int j = 0 ; j < 8 ; j++) {
tm[i][j] = getlen(i , j);
}
}
memset(dp , inf , sizeof(dp));
dp[0][0] = 0;
for(int i = 0 ; i < 8 ; i++) {
for(int j = 0 ; j < (1 << 8) ; j++) {
if(dp[i][j] == inf) continue;
for(int l = 0 ; l < 8 ; l++) {
if(j & (1 << l)) continue;
dp[i + 1][j | (1 << l)] = min(dp[i + 1][j | (1 << l)] , dp[i][j] + tm[i][l]);
}
}
}
ans = min(ans , dp[8][(1 << 8) - 1]);
}
void dfs(int row) {
if(row >= 8) {
solve();
return ;
}
for(int i = 0 ; i < 8 ; i++) {
if(!vis_col[i] && !vis_l[i - row + 8] && !vis_r[i + row]) {
vis_col[i] = true , vis_l[i - row + 8] = true , vis_r[i + row] = true;
aim[row].x = row , aim[row].y = i;
dfs(row + 1);
vis_col[i] = false , vis_l[i - row + 8] = false , vis_r[i + row] = false;
}
}
}
int main() {
int t , Case = 0;
scanf("%d" , &t);
while(t--) {
int cnt = 0;
memset(mmp , 0 , sizeof(mmp));
for(int i = 0 ; i < 8 ; i++) {
scanf("%s" , mmp[i]);
for(int j = 0 ; j < 8 ; j++) if(mmp[i][j] == 'q') node[cnt].x = i , node[cnt++].y = j;
}
ans = inf;
memset(vis_col , false , sizeof(vis_col));
memset(vis_l , false , sizeof(vis_l));
memset(vis_r , false , sizeof(vis_r));
dfs(0);
printf("Case %d: %d\n" , ++Case , ans);
}
return 0;
}
lightoj 1061 - N Queen Again(状压dp)的更多相关文章
- lightoj 1037 - Agent 47(状压dp)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1037 #include <iostream> #include & ...
- lightoj 1086 - Jogging Trails(状压dp)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1086 题解:题目就是求欧拉回路然后怎么判断有欧拉回路只要所有点的度数为偶数.那 ...
- lightoj 1057 - Collecting Gold(状压dp)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1057 题解:看似有点下记忆话搜索但是由于他是能走8个方向的也就是说两点的距离其 ...
- lightoj 1119 - Pimp My Ride(状压dp)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1119 题解:状压dp存一下车有没有被搞过的状态就行. #include < ...
- K - Painful Bases 状压dp
Painful Bases LightOJ - 1021 这个题目一开始看,感觉有点像数位dp,但是因为是最多有16进制,因为限制了每一个数字都不同最多就有16个数. 所以可以用状压dp,看网上题解是 ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- nefu1109 游戏争霸赛(状压dp)
题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...
- poj3311 TSP经典状压dp(Traveling Saleman Problem)
题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...
- [NOIP2016]愤怒的小鸟 D2 T3 状压DP
[NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...
- 【BZOJ2073】[POI2004]PRZ 状压DP
[BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...
随机推荐
- UE4 代理 BindRaw和BindUObject
代理允许您在C++对象上以通用的但类型安全的方式调用成员函数.通过使用代理,可以将其动态地绑定到任何对象的成员函数上,然后在该对象上调用函数,即时调用者不知道该对象的类型也没关系. 任何时候都应该通过 ...
- Ubuntu中修改默认开机项
1首先,按住Ctrl+Alt+t打开终端 2输入cd /etc/default 3输入sudo sudo nano grub 并按照提示输入密码 4在我们开机的时候,可以看到自己想要默认的开机项是多少 ...
- Spring浅入浅出——不吹牛逼不装逼
Spring浅入浅出——不吹牛逼不装逼 前言: 今天决定要开始总结框架了,虽然以前总结过两篇,但是思维是变化的,而且也没有什么规定说总结过的东西就不能再总结了,是吧.这次总结我命名为浅入浅出,主要在于 ...
- 【Java例题】6.1 进制转换
1.进制转换.输入一个某种进制的整数,将其转换为其它进制的整数.说明:仅考虑十.二.八和十六进制. package chapter6; import java.util.*; public class ...
- 七天学会NodeJS——第一天
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者.原文出处:http://nqdeng.github.io/7-days-nodejs Node.js 是一个能 ...
- elk系列教程:docker中安装配置elk
elasticSearch Docker安装elasticsearch: docker pull docker.io/elasticsearch:7.2.0 启动: docker run -p 920 ...
- POI通用导出Excel数据(包括样式设计)
前言 前一段时间我写过通用的导入Excel,前几天也写了导出pdf格式的,还有我之前搞得导出Word,我在之前的博客也都介绍了导出和导入是一个道理,无非是一个获取一个是赋值.昨天有一位同仁看了我的Ex ...
- viewpager+fragment结合
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private ViewPa ...
- Notepad++编辑器——Verilog、代码片段、F6编译
Notepad++是一款精致小巧的编辑器,自带Verilog语法识别功能,插件也挺好用的.这里陈列一下我的设置. 版本:Notepad++ 7.6.6 ,32位 //================= ...
- JavaWeb无框架,借助反射采用精巧设计模式实现放微信PC聊天页面
本周开始在写仿写一个微信PC端的聊天页面,没有使用ssh.ssm等框架,采用JavaWeb.反射.MySQL.C3P0等技术.这里把其中和核心技术列出来请大家指教. 与传统JavaWeb项目的区别 传 ...