题目链接: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源码分析-ArrayList

    概述 ArrayList 是 List 接口的一个实现类,也是 Java 中最常用的容器实现类之一,可以把它理解为「可变数组」. 我们知道,Java 中的数组初始化时需要指定长度,而且指定后不能改变. ...

  2. 彻底理解kubernetes CNI

    kubernetes各版本离线安装包 CNI接口很简单,特别一些新手一定要克服恐惧心里,和我一探究竟,本文结合原理与实践,认真读下来一定会对原理理解非常透彻. 环境介绍 我们安装kubernetes时 ...

  3. spark shuffle写操作三部曲之BypassMergeSortShuffleWriter

    前言 再上一篇文章 spark shuffle的写操作之准备工作 中,主要介绍了 spark shuffle的准备工作,本篇文章主要介绍spark shuffle使用BypassMergeSortSh ...

  4. 准时制生产(Just in Time,JIT)

    准时制生产(Just in Time,JIT)称为及时生产,出自日本丰田.         1.JIT生产方式的管理理念     JIT的基本概念事指在所需要的精确时间内,按所需要的质量和数量,生产所 ...

  5. Canvas动画(PC端 移动端)

    Canvas动画(PC端 移动端) 一,介绍与需求 1.1,介绍 canvas是HTML5中新增一个HTML5标签与操作canvas的javascript API,它可以实现在网页中完成动态的2D与3 ...

  6. 定时器任务django-crontab的使用【静态化高频率页面,增加用户体验】【系统的定时器,独立于项目执行】【刘新宇】

    页面静态化 思考: 网页的首页访问频繁,而且查询数据量大,其中还有大量的循环处理. 问题: 用户访问首页会耗费服务器大量的资源,并且响应数据的效率会大大降低. 解决: 页面静态化 1. 页面静态化介绍 ...

  7. 【win】【qt5打包】【qt程序打包成一个可执行文件(带图标任何win都可以运行哦)】

    [前言] 业务需求将qt程序打包成win可执行文件.咱是做linux的,奈何用的麒麟系统,程序运行在win,好嘛,重新在win qtcreator编译后打包呗. [目标] 1.给qt程序添加一个图标. ...

  8. JVM调优前戏之JDK命令行工具---jhat

    在JDK的命令行中,一般开发人员最耳熟能详的肯定就是java,javac,javap等常用命令,不过在jdk/bin下还有许多其他的命令行工具,它们被用来监测JVM运行时的状态,下面我们来详细解读一下 ...

  9. 100天搞定机器学习|Day35 深度学习之神经网络的结构

    100天搞定机器学习|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机器学习 ...

  10. 7.26 面向对象_封装_property_接口

    封装 封装 就是隐藏内部实现细节, 将复杂的,丑陋的,隐私的细节隐藏到内部,对外提供简单的访问接口 为什么要封装 1.保证关键数据的安全性 2.对外部隐藏实现细节,隔离复杂度 什么时候应该封装 1.当 ...