题目链接: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. Hive映射HBase表的几种方式

    1.Hive内部表,语句如下 CREATE TABLE ods.s01_buyer_calllogs_info_ts( key string comment "hbase rowkey&qu ...

  2. vue3.0中的双向数据绑定方法

    熟悉vue的人都知道在vue2.x之前都是使用object.defineProperty来实现双向数据绑定的 而在vue3.0中这个方法被取代了 1. 为什么要替换Object.definePrope ...

  3. oracle的本地远程连接和配置

    Oracle数据库的远程连接可以通过多种方式来实现,本文我们主要介绍四种远程连接的方法和注意事项,并通过示例来说明,接下来我们就开始介绍. 第一种情况: 若oracle服务器装在本机上,那就不多说了, ...

  4. .net core使用ocelot---第一篇 简单使用

    简介原文地址 接下来你会学习,基于asp.net core 用Ocelot实现一个简单的API网关.或许你会疑问什么是API网关,我们先看下面的截图 API网关是访问你系统的入口,它包括很多东西,比如 ...

  5. Activiti6系列(1)- 核心数据库表及字段注释说明

    前言 本文是根据<疯狂工作流讲义-Activiti6.0>一书中提取过来的,有兴趣的可以去当当网买这本书,讲的很不错,最后还有实战案例. 虽然是提取过来的,但完全靠手打梳理,觉得有用的小伙 ...

  6. A human being,who loves football and music

    ---title: aboutdate: 2019-08-09 20:52:27---[A human being,who loves football and music.](https://eel ...

  7. hadoop安装解决之道

    # 壹.故障现象 ```xml Microsoft Windows [版本 10.0.18362.239] (c) 2019 Microsoft Corporation.保留所有权利. C:\User ...

  8. 分享我的GD32F450的IAP过程

    最近一个项目使用GD32F450VI+ESP8266需要做远程升级,基本参考正点原子IAP的那一章节,但是在GD32F450上却遇到了问题,无法跳转,然后使用正点原子的开发板stm32f429,以及s ...

  9. RE最全面的正则表达式----终结篇 特殊处理

    三.特殊需求表达式 Email地址:^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0- ...

  10. 洛谷 P2704 [NOI2001]炮兵阵地

    题意简述 给定一张地图,有山地H,平原P,平原可放置炮兵, 炮兵可以攻击沿横向左右各两格,沿纵向上下各两格的区域 求最多放几个炮兵,使他们两两攻击不到 题解思路 枚举第i层,第i - 1层,第i - ...