题目链接: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. 【iOS】“找不到使用指定主机名的服务器”

    今天用 Application Loader 提交 APP 的时,遇到了这个奇葩的问题,如下图: 后来换个网络解决了……我也不知道什么原因,就这么奇葩的弄好了……

  2. 【OpenCV-ANN神经网络自动驾驶】树莓派OpenCV神经网络自动驾驶小车【源码+实物】

    没错!这个是我的毕业设计!!! 整个电子信息学院唯一一个优秀毕业设计 拿到这里炫耀了 实物如下: 电脑端显示效果: 自动驾驶实现过程: 1. 收集图像数据.建立局域网,让主机和Raspberry Pi ...

  3. Wpf窗口设置屏幕居中最前显示

    public Window()         {             InitializeComponent();             WindowStartupLocation = Win ...

  4. ajax定义与开发最简五步骤

    ajax是什么? a (async异步)  j (javascript)  a (and)  x (xml)即异步的javascript和xml ajax特点:异步 不刷新整个页面 (局部刷新) we ...

  5. 【Java笔记】【Java核心技术卷1】chapter3 D3数据类型

    package chapter3; public class D3数据类型 { public static void main(String[] arg) { //Java 整型(字节数不会随硬件变化 ...

  6. 七天学会NodeJS——第一天

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者.原文出处:http://nqdeng.github.io/7-days-nodejs Node.js 是一个能 ...

  7. cogs 1254. 最难的任务 Dijkstra + 重边处理

    1254. 最难的任务 ★   输入文件:hardest.in   输出文件:hardest.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述] 这个真的很难.算出 123 ...

  8. CSS3: @font-face 介绍与使用

    @font-face 是CSS3中的一个模块,他主要是把自己定义的Web字体嵌入到你的网页中,随着@font-face模块的出现,我们在Web的开发中使用字体不怕只能使用Web安全字体,你们当中或许有 ...

  9. struts与springmvc有何区别

    Struts2与SpringMVC有何区别? (1)SpringMVC的核心控制器是基于servlet技术,而Struts2是基于filter. (2)Struts2是类级别的拦截, 一个类对应一个r ...

  10. studio无限轮播

    <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&q ...