题目描述

• 一个 4 × 4 的 0/1 矩阵

• 每次可以交换相邻两个元素

• 求从初始状态到目标状态的最小交换次数

输入格式

前四行,每行一个长为 4 的 0/1 字符串,描述初始状态。

后四行,每行一个长为 4 的 0/1 字符串,描述目标状态。

输出格式

一行一个数,表示最小交换次数。

样例输入

1111
0000
1110
0010
1010
0101
1010
0101

样例输出

4

solution:

不得不说这确实是道好题,而且难度适中。看到此题为0/1字符串并且数据规模小(但也太小了吧)可以想到状压因为只有16个格子,所以不同的局面最多只有2^16 = 65536 个,不过01数量对等所以准确的说应该只有12870 个。所以我们Hash :把 16 个格子的 0/1 压成一个数字就好了。

但如果仔细分析一下题目性质,我们可以发现一些不同:我们在读入目标棋盘的时候,把当前位置的数和目标棋盘进行比较,如果不一样,比如当前是1,目标是0,那么我们就把当前位置加入move队列里去,否则加入got队列里去。move和got的队列肯定是一样长的。然后我们将这两个队列里的元素进行匹配,把move里的一个位置上的1移到got里的一个位置上去,该操作需要的步数,就是这两个位置的曼哈顿距离

这样我们可以搜索来枚举匹配方案,当然也可以直接带权二分图匹配(这样可以应对数据范围很大的题型)

code:

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set> #define ll long long
#define db double
#define inf 0x7fffffff
#define rg register int using namespace std; struct su{
int x,y;
}a[101],b[101]; int n,m,t1,t2,ans=inf;
bool c[11][11];
bool d[11][11];
int s[101][101];
bool use[101]; inline int qr(){ char ch;
while((ch=getchar())<'0'||ch>'9');
return ch^48;
} inline void dfs(int t,int tot){
if(t==t1+1){
ans=tot;
return ;
}
for(rg i=1;i<=t2;++i){
if(use[i]||tot+s[t][i]>ans)
continue;
use[i]=1;
dfs(t+1,tot+s[t][i]);
use[i]=0;
}
} int main(){
//freopen("game.in","r",stdin);
//freopen("game.out","w",stdout);
n=m=4;
for(rg i=0;i<n;++i)
for(rg j=0;j<m;++j)
c[i][j]=qr();
for(rg i=0;i<n;++i){
for(rg j=0;j<m;++j){
d[i][j]=qr();
if(c[i][j]^d[i][j]){
if(c[i][j]){
a[++t1].x=i;
a[t1].y=j;
}else{
b[++t2].x=i;
b[t2].y=j;
}
}
}
} rg x,y;
for(rg i=1;i<=t1;++i){
for(rg j=1;j<=t2;++j){
x=a[i].x-b[j].x;
y=a[i].y-b[j].y;
if(x<0)x=-x;
if(y<0)y=-y;
s[i][j]=x+y;
}
} dfs(1,0);
printf("%d",ans);
return 0;
}

[HAOI2008]移动玩具(状压&带权二分图)的更多相关文章

  1. bzoj1054: [HAOI2008]移动玩具 状压+爆搜即可

    题意:在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动次数将初的玩具状态 ...

  2. [HAOI2008]移动玩具 状压

    发现自己只会打状压了. 233333 不需要考虑是否会被挡,所以直接dp #include<cstdio> #include<cstring> #include<iost ...

  3. HDU 2255 奔小康赚大钱(带权二分图最大匹配)

    HDU 2255 奔小康赚大钱(带权二分图最大匹配) Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子. 这可是一件大事,关系到人民的住房问题啊 ...

  4. POJ 2195 Going Home (带权二分图匹配)

    POJ 2195 Going Home (带权二分图匹配) Description On a grid map there are n little men and n houses. In each ...

  5. Luogu 1559 运动员最佳匹配问题(带权二分图最大匹配)

    Luogu 1559 运动员最佳匹配问题(带权二分图最大匹配) Description 羽毛球队有男女运动员各n人.给定2 个n×n矩阵P和Q.P[i][j]是男运动员i和女运动员j配对组成混合双打的 ...

  6. 运动员最佳匹配问题 KM算法:带权二分图匹配

    题面: 羽毛球队有男女运动员各n人.给定2 个n×n矩阵P和Q.P[i][j]是男运动员i和女运动员j配对组成混合双打的男运动员竞赛优势:Q[i][j]是女运动员i和男运动员j配合的女运动员竞赛优势. ...

  7. POJ 2195 Going Home | 带权二分图匹配

    给个地图有人和房子 保证人==房子,每个人移动到房子处需要花费曼哈顿距离的代价 问让人都住在房子里最小代价 显然是个带权二分图最大匹配 转化成以一个网络,规定w是容量,c是代价 1.S向人连边,w=1 ...

  8. KM(Kuhn-Munkres)算法求带权二分图的最佳匹配

    KM(Kuhn-Munkres)算法求带权二分图的最佳匹配 相关概念 这个算法个人觉得一开始时有点难以理解它的一些概念,特别是新定义出来的,因为不知道是干嘛用的.但是,在了解了算法的执行过程和原理后, ...

  9. 费用流模板(带权二分图匹配)——hdu1533

    /* 带权二分图匹配 用费用流求,增加源点s 和 汇点t */ #include<bits/stdc++.h> using namespace std; #define maxn 1000 ...

随机推荐

  1. PAT甲题题解-1022. Digital Library (30)-map映射+vector

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789235.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  2. IDA Pro 在CSAPP lab2中的使用

    在做lab2的时候,偶然的情况下,发现了IDA pro这样一个反汇编工具,总的来说对于lab2这样的小实验读懂代码的大体功能是有作用的,但对于想要具体明白某一条指令的执行过程,又显得不足,到最后还是需 ...

  3. python数据分析Titanic_Survived预测

    import pandas as pd import matplotlib.pyplot as plt # matplotlib画图注释中文需要设置from matplotlib.font_manag ...

  4. Alpha冲刺——day7

    Alpha冲刺--day7 作业链接 Alpha冲刺随笔集 github地址 团队成员 031602636 许舒玲(队长) 031602237 吴杰婷 031602220 雷博浩 031602634 ...

  5. golang yaml配置文件解析

    yaml文件语法 此模块内容转自:http://www.ruanyifeng.com/blog/2016/07/yaml.html 大小写敏感 使用缩进表示层级关系 缩进时不允许使用Tab键,只允许使 ...

  6. day5——Java 实现导出excel表 POI(转)

    1.首先下载poi-3.6-20091214.jar,下载地址如下: http://download.csdn.net/detail/evangel_z/3895051 2.Student.java ...

  7. linux虚拟机安装中出现的问题

    当虚拟机加载镜像时,出现下面的错误: vmware 已将该虚拟机配置为使用 64 位客户机操作系统.但是,无法执行 64 位操作. 错误提示:已将该虚拟机配置为使用 64 位客户机操作系统.但是,无法 ...

  8. thnkphp框架面试问题

    Thinkphp面试问题 1.如何理解TP中的单一入口文件? 答:ThinkPHP采用单一入口模式进行项目部署和访问,无论完成什么功能,一个项目都有一个统一(但不一定是唯一)的入口.应该说,所有项目都 ...

  9. Redis的核心Hystrix在Spring mvc的使用

    核心Hystrix,Hystrix对于接口调用具有很好的保护,能在多服务依赖的分布式系统中,有效的提供应用的可用性,并且对失败应用进行熔断和恢复检查,让应用在复杂的环境中也能各种稳. http://t ...

  10. linux课外命令

    1.要知道linux是多少位的 在命令行输入 getconf LONG_BIT 返回32就是32位,返回64就是64位的. 2.CentOS-7-x86_64-DVD-1708.iso 这种代表64位 ...