题目链接: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)的更多相关文章

  1. lightoj 1037 - Agent 47(状压dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1037 #include <iostream> #include & ...

  2. lightoj 1086 - Jogging Trails(状压dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1086 题解:题目就是求欧拉回路然后怎么判断有欧拉回路只要所有点的度数为偶数.那 ...

  3. lightoj 1057 - Collecting Gold(状压dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1057 题解:看似有点下记忆话搜索但是由于他是能走8个方向的也就是说两点的距离其 ...

  4. lightoj 1119 - Pimp My Ride(状压dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1119 题解:状压dp存一下车有没有被搞过的状态就行. #include < ...

  5. K - Painful Bases 状压dp

    Painful Bases LightOJ - 1021 这个题目一开始看,感觉有点像数位dp,但是因为是最多有16进制,因为限制了每一个数字都不同最多就有16个数. 所以可以用状压dp,看网上题解是 ...

  6. BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

  7. nefu1109 游戏争霸赛(状压dp)

    题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...

  8. poj3311 TSP经典状压dp(Traveling Saleman Problem)

    题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...

  9. [NOIP2016]愤怒的小鸟 D2 T3 状压DP

    [NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...

  10. 【BZOJ2073】[POI2004]PRZ 状压DP

    [BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...

随机推荐

  1. 【JDK】JDK源码分析-LinkedHashMap

    概述 前文「JDK源码分析-HashMap(1)」分析了 HashMap 主要方法的实现原理(其他问题以后分析),本文分析下 LinkedHashMap. 先看一下 LinkedHashMap 的类继 ...

  2. 【iOS】NSLog 打印 BOOL 类型值

    这个问题以前没在意,刚偶然打印,发现有些问题,上网查了下,发现是这么搞的: NSLog(@"%@", isEqual?@"YES":@"NO" ...

  3. 【iOS】The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods install

    从 github 下载的项目经常会遇到这个问题, 如图所示: 参考: iOS 'The sandbox is not sync with the Podfile.lock'问题解决 尚未解决…………

  4. gitee+hexo搭建个人博客

    通过gitee和hexo搭建个人博客 首先准备软件: git (提供命令git) git官网 notepad++(方便编辑)notepad++官网 nodejs(hexo依赖)nodejs官网 7z( ...

  5. Linux(Ubuntu)安装Swift和Swiftlint

    很多时候iOS开发完毕需要接入CI中,而很多CI是基于Linux的,需要在Linux平台安装Swift和Swiftlint,下面就是针对这两个软件的安装步骤. Swift安装 环境 系统:Ubuntu ...

  6. loadrunner中的ie浏览器无法使用

    我的loadrunner是12.55版本的,windows10系统 在我们学习loadrunner的过程中,会出现下面一个问题: 在录制脚本时,loadrunner中的ie浏览器无法使用处于飘红状态. ...

  7. HTML/CSS:div居中和div内部元素垂直居中(1)

    div居中 div水平和垂直居中,text-align和vertical-align不起作用,因为标签div没有这两个属性,所以再css中设置这两个值不能居中的效果 1. div水平居中:设置marg ...

  8. java优雅注释原则和代码格式列举

    一.java的三种注释类型 单行注释:// ...... 块注释:/* ...... */ 文档注释:/** ...... */ 二.指导原则 注释不能美化糟糕的代码,碰到糟糕的代码就重新写吧. 用代 ...

  9. MTFlexbox自动化埋点探索

    1. 背景 跨平台动态化技术是目前移动互联网领域的重点关注方向,它既能节约人力,又能实现业务快速上线的需求.经过十年的发展,美团App已经变成了一个承载众多业务的超级平台,众多的业务方对业务形态的快速 ...

  10. 在ubuntu下使用CMake及VSCode对LoRaMac-node代码进行编译调试

    准备工作 下载代码LoRaMac-node  阅读LoRaMac-node目录下的doc文件夹中的development-environment.md 开工 安装所需环境 CMaka( >= 3 ...