1054: [HAOI2008]移动玩具

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

Input

  前4行表示玩具的初始状态,每行4个数字1或0,1表示方格中放置了玩具,0表示没有放置玩具。接着是一个空
行。接下来4行表示玩具的目标状态,每行4个数字1或0,意义同上。

Output

  一个整数,所需要的最少移动次数。

Sample Input

1111
0000
1110
0010

1010
0101
1010
0101

Sample Output

4
 

分析:

这道题拿到之后第一件想到的事情就是,诶!这是道深搜题诶。而且这个搜索很明显。这道题的数据应该也挺水的所以,就没想什么别的方法

我想的简单粗暴。
1,我们发现,无论怎么移动,如果初始和最终都放了话,那个位置其实不用考虑。因为。就算要移动它,因为它本来就要放哪个位置,那就得找一个新的放在哪个位置。这个过程我们可以想成移动别的点经过了这个位置。
2,因为如果深搜每次只能移动一个点。那么我们就在去完重后对每个初始节点将整张图搜索一遍。将每个遇到对目标节点记录其的步数。这些都放到一个forces [ number ] [ z ] 这里number指的是第几个初始节点 z指的是第几个目标节点。枚举整个图。完成整个表。。为什么我们每次不举最短的那个目标节点。因为。纵观全局,可能会遇到。虽然这个点当前是最近的。但是对别的点来说就没有最近的点。所以我们得考虑全局。当然考虑全局有很多办法。但是我都说了没想什么办法。直接暴力。
3,之后就是组合整个forces数组了,每次每个目标节点只能与一个初始节点匹配。同时还保证综合的步数最小。因为我没这么想(同上)。既然都这么暴力了!那就更暴力一点啊啊啊啊!!!!!!直接用全排列来解决这个问题。

这就是我的黄暴做法。然而所以。就是这样。dalao看到了千万别喷。

#include<cstdio>
#include<algorithm>
#include<string.h>
using namespace std;
int one[5][5],two[5][5],cnt;
int forces[17][17];
int left[4]={1,-1,0,0},right[4]={0,0,1,-1};
int visit[5][5],ans=214748;
int visit_1[20];
struct node{
int x,y,step;
}queue[1001];
void BFS(int x_1,int y_1,int number)
{
memset(visit,0,sizeof(visit));
int head=1,last=1;
node first;
first.x=x_1;first.y=y_1;first.step=0;
queue[1]=first;visit[x_1][y_1]=1;
while(head<=last)
{
node news=queue[head];
for(int i=0;i<4;++i)
{
int x=news.x+left[i],y=news.y+right[i];
if(x>0&&x<=4&&y>0&&y<=4&&(!visit[x][y]))
{
node zz;
zz.x=x;zz.y=y;zz.step=news.step+1;
if(two[x][y]){
forces[number][two[x][y]]=zz.step;
}
queue[++last]=zz;
visit[x][y]=1;
}
}
++head;
}
return ;
}
int lie[20];
void DFS(int x)
{
if(x>cnt)
{
int ans_1=0;
for(int i=1;i<=cnt;++i)
{
ans_1+=forces[i][lie[i]];
}
ans=min(ans,ans_1);
return ;
}
for(int i=1;i<=cnt;i++)
{
if(visit_1[i])continue;
visit_1[i]=1;
lie[x]=i;
DFS(x+1);
visit_1[i]=0;
lie[x]=0;
}
return ;
}
int main()
{
for(int i=1;i<=4;++i)
for(int j=1;j<=4;++j)
scanf("%1d",&one[i][j]);
for(int i=1;i<=4;++i)
for(int j=1;j<=4;++j)
{
scanf("%1d",&two[i][j]);
if(two[i][j]==1&&two[i][j]==one[i][j])
one[i][j]=two[i][j]=0;
else if(two[i][j]==1){
++cnt;
two[i][j]=cnt;
}
}
int cnt_1=0;
for(int i=1;i<=4;i++)
for(int j=1;j<==4;++j)
{
if(one[i][j])
{
++cnt_1;
BFS(i,j,cnt_1);
}
}
DFS(1);
printf("%d",ans);
return 0;
}

嗯。就是这样。我觉得已经够暴力了。。

BZOJ 1054 广搜的更多相关文章

  1. Bzoj 2252: [2010Beijing wc]矩阵距离 广搜

    2252: [2010Beijing wc]矩阵距离 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 563  Solved: 274[Submit][ ...

  2. BZOJ 1054 题解

    1054: [HAOI2008]移动玩具 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1888  Solved: 1035[Submit][Stat ...

  3. HDU--杭电--1195--Open the Lock--深搜--都用双向广搜,弱爆了,看题了没?语文没过关吧?暴力深搜难道我会害羞?

    这个题我看了,都是推荐的神马双向广搜,难道这个深搜你们都木有发现?还是特意留个机会给我装逼? Open the Lock Time Limit: 2000/1000 MS (Java/Others)  ...

  4. HDU 5652(二分+广搜)

    题目链接:http://acm.hust.edu.cn/vjudge/contest/128683#problem/E 题目大意:给定一只含有0和1的地图,0代表可以走的格子,1代表不能走的格 子.之 ...

  5. nyoj 613 免费馅饼 广搜

    免费馅饼 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy ...

  6. poj 3984:迷宫问题(广搜,入门题)

    迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7635   Accepted: 4474 Description ...

  7. poj 3278:Catch That Cow(简单一维广搜)

    Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 45648   Accepted: 14310 ...

  8. 双向广搜 POJ 3126 Prime Path

      POJ 3126  Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16204   Accepted ...

  9. 广搜+打表 POJ 1426 Find The Multiple

    POJ 1426   Find The Multiple Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 25734   Ac ...

随机推荐

  1. HEXO+PAGE 搭建个性博客

    新博客地址: http://javen205.oschina.io https://javen205.github.io Hexo 是高效的静态站点生成框架,她基于 Node.js. 通过 Hexo ...

  2. [转] 配置Log4j

    Log4J的配置文件(Configuration File)就是用来设置记录器的级别.存放器和布局的,它可接key=value格式的设置或xml格式的设置信息.通过配置,可以创建出Log4J的运行环境 ...

  3. Activemq消息类型

    Activemq消息类型JMS规范中的消息类型包括TextMessage.MapMessage.ObjectMessage.BytesMessage.和StreamMessage等五种.ActiveM ...

  4. db2 中文表名和字段

    建库语句 create db test on D: using codeset GBK territory CN 或者 territory cn codeset 和 territory 都是需要指定 ...

  5. LCLFramework框架之开发约束

    Entity编写 1:所有的实体类都必须继承DomainEntity 2:所有的表都必须有 ID 3:所有表的关系字段必须是ID [Serializable] public class User: D ...

  6. Embeding Python & Extending Python with FFPython

    Introduction ffpython is a C++ lib, which is to simplify tasks that embed Python and extend Python. ...

  7. Mac系统下,在android studio中使用Github版本管理

    1.下载并安装github客户端http://git-scm.com/download/ 2.打开android studio,测试github是否使用ok 点击"test",如果 ...

  8. [亿能测试_www.gdtesting.com]测试技术资料网盘共享

    [亿能测试_www.gdtesting.com]测试技术资料网盘共享: http://pan.baidu.com/share/home?uk=974090852

  9. [PaPaPa][需求说明书][V2.0]

    前   言 大家好,我是“今晚打老虎”. 什么? 你问我为什么这次亮字号了? 还不是因为哥太出名了,即使我不亮你们也知道是我写的了. 自从发布了V1.0版本之后.群里又进来好多人.30K大大分发的任务 ...

  10. Github的基本配置与使用

    第一步:尝试创建SSH key ssh-keygen -t rsa -C xxxxx@gmail.com 默认在~/.ssh目录生成id_rsa与id_rsa.pub. -t代表密钥类型,常见的类型有 ...