hdu.1254.推箱子(bfs + 优先队列)

推箱子

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6021    Accepted Submission(s): 1718

Problem Description
推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不能拉箱子,因此如果箱子被推到一个角上(如图2)那么箱子就不能再被移动了,如果箱子被推到一面墙上,那么箱子只能沿着墙移动.
现在给定房间的结构,箱子的位置,搬运工的位置和箱子要被推去的位置,请你计算出搬运工至少要推动箱子多少格.

 

Input
输入数据的第一行是一个整数T(1<=T<=20),代表测试数据的数量.然后是T组测试数据,每组测试数据的第一行是两个正整数M,N(2<=M,N<=7),代表房间的大小,然后是一个M行N列的矩阵,代表房间的布局,其中0代表空的地板,1代表墙,2代表箱子的起始位置,3代表箱子要被推去的位置,4代表搬运工的起始位置.

 

Output
对于每组测试数据,输出搬运工最少需要推动箱子多少格才能帮箱子推到指定位置,如果不能推到指定位置则输出-1.

 

Sample Input
1 5 5 0 3 0 0 0 1 0 1 4 0 0 0 1 0 0 1 0 2 0 0 0 0 0 0 0

 

Sample Output
4
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<math.h>
 4 #include<queue>
 5 int T ;
 6 int n , m ;
 7 const int M = 10 ;
 8 int map[M][M] ;
 9 bool vis[M][M][M][M] ;
10 int move[][2] = {{1,0} , {-1 , 0} , {0,1} , {0 , -1} } ;
11 struct node
12 {
13     int x , y ;
14     int a , b ;
15     int time ;
16     bool operator < (const node &rhs ) const
17     {
18         return time > rhs.time ;
19     }
20 };
21 
22 int bfs (int sx , int sy , int mx , int my , int ex , int ey)
23 {
24     //printf ("Last---> (%d,%d)\n" , ex , ey ) ;
25     node ans , tmp ;
26     std::priority_queue<node> q ;
27     memset (vis , 0 , sizeof(vis)) ;
28     while ( !q.empty ()) q.pop () ;
29     q.push ( (node) {sx , sy , mx , my , 0}) ;
30     vis[sx][sy][mx][my] = 1 ;
31     if (mx == ex && my == ey) return 0 ;
32     while ( !q.empty ()) {
33         ans = q.top () ; q.pop () ;
34        // printf ("S----(%d,%d) tui (%d,%d)\n" , ans.x , ans.y , ans.a , ans.b ) ;
35         for (int i = 0 ; i < 4 ; i ++) {
36             tmp = ans ;
37             tmp.x += move[i][0] ; tmp.y += move[i][1] ;
38             if (tmp.x < 0 || tmp.y < 0 || tmp.x == n || tmp.y == m) continue ;
39             if (map[tmp.x][tmp.y] == 1 ) continue ;
40             if (tmp.x == tmp.a && tmp.y == tmp.b ) {
41                 int x = tmp.x + move[i][0] , y = tmp.y + move[i][1] ;
42                 if (x < 0 || y < 0 || x == n || y == m) continue ;
43                 if (map[x][y] == 1) continue ;
44                 tmp.a = x , tmp.b = y ;
45                 tmp.time ++ ;
46             }
47             if (vis[tmp.x][tmp.y][tmp.a][tmp.b]) continue ;
48             vis[tmp.x][tmp.y][tmp.a][tmp.b] = 1 ;
49             q.push (tmp ) ;
50            // printf ("(%d,%d) tui (%d,%d)\n" , tmp.x , tmp.y , tmp.a , tmp.b ) ;
51             if (tmp.a == ex && tmp.b == ey) return tmp.time ;
52         }
53     }
54     return - 1 ;
55 }
56 
57 int main ()
58 {
59     //freopen ("a.txt" , "r" , stdin ) ;
60     scanf ("%d" , &T ) ;
61     while (T --) {
62         scanf ("%d%d" , &n , &m ) ;
63         int k ;
64         int sx , sy , ex , ey , mx , my ;
65         for (int i = 0 ; i < n ; i ++) for (int j = 0 ; j < m ; j ++) scanf ("%d" , &map[i][j]) ;
66         for (int i = 0 ; i < n ; i ++) {
67             for (int j = 0 ; j < m ; j ++) {
68                 if (map[i][j] == 4) sx = i , sy = j ;
69                 else if (map[i][j] == 2) mx = i , my = j ;
70                 else if (map[i][j] == 3) ex = i , ey = j ;
71             }
72         }
73         if ( (k = bfs (sx , sy , mx , my , ex , ey )) == -1) puts ("-1") ;
74         else printf ("%d\n" , k ) ;
75     }
76     return 0 ;
77 }
78 [ Copy to Clipboard ]    [ Save to File]
View Code


 

转载于:https://www.cnblogs.com/get-an-AC-everyday/p/4494740.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/431816.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ae合成设置快捷键_怎么在ae中剪切视频?怎么在ae里裁剪视频?

ae剪切裁剪视频教程&#xff1a;零基础学AE软件影视后期必修课程-AE新建合成-羽兔网​www.yutu.cn1、启动After Effects并导入视频第一个任务是打开一个新项目&#xff0c;并将视频加载到其中。首先从主菜单中选择新的构图。然后打开构图菜单&#xff0c;选择所需的分辨率等&am…

php js获取元素id,javascript通过中文id和class获取元素的方法

以前以为html元素中的id和class等只能通过字母数字或者下划线等特殊字符命名&#xff0c;如果单存使用中文浏览器不会报错&#xff0c;但是js是获取不到的&#xff0c;但是今天逛论坛的时候发现不是这样的。代码如下&#xff1a;运行结果&#xff1a;论坛来源是这个&#xff1a…

delphi random 六位_《蒙面唱将猜猜猜》第五季将播,六位唱将率先登场

原标题&#xff1a;《蒙面唱将猜猜猜》第五季将播&#xff0c;六位唱将率先登场新京报讯(记者 刘玮)《蒙面唱将猜猜猜》第五季将于11月1日21&#xff1a;10在江苏卫视首播&#xff0c;优酷视频全网独播。第五季中&#xff0c;猜评团不仅“觊觎”各路唱将的真实身份&#xff0c;…

java中sql之count,SQL COUNT() 函数--编程学习网

COUNT() 函数返回匹配指定条件的行数。SQL COUNT(column_name) 语法COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入)&#xff1a;SELECT COUNT(column_name) FROM table_name;SQL COUNT(*) 语法COUNT(*) 函数返回表中的记录数&#xff1a;SELECT COUNT(*) FROM tabl…

苹果笔记本双系统怎么切换_2020年你该怎么选择苹果笔记本,资深用户带你讲透MacBook Air MacBook Pro...

作为一名曾经的苹果生态开发者我2012年10月份购入自己的第一台苹果笔记本&#xff1a;MacBook Pro 13寸&#xff0c;那时候还很厚重&#xff0c;机械硬盘的配置&#xff0c;为了省钱&#xff0c;在官网翻新机渠道购买的&#xff0c;记得当初新机的原价是8000多&#xff0c;翻新…

苹果6s怎么导出照片_怎么恢复苹果手机删除的照片?今天教你三种找回方法

怎么恢复苹果手机删除的照片&#xff1f;手机的出现虽然带给我们很大便利&#xff0c;同时却也带来了一些小的麻烦。在手机上很多操作步骤都很简单&#xff0c;因此&#xff0c;难免会遇到手滑误操作的情况。拿照片这项内容来说&#xff0c;我们可能误删除一些本来不需要删除的…

iptables 开放远程_远程FX正式上市 指导价11.99万-12.99万元_搜狐汽车

本文车型速览除了文章作者的主观观点外&#xff0c;我们正尝试基于全网可查的客观数据&#xff0c;为您提供中立、客观的参考依据&#xff1a;本文部分车型速览&#xff1a;畅销车型质量排行top10展开微信扫码&#xff0c;直接一次看完附近所有城市低价(附近城市均有经销商可售…

matlab项目实例教程,matlab简明实例教程.doc

matlab简明实例教程.doc 南京航空航天大学王正盛1MATLAB数学工具软件实例简明教程王正盛编写南京航空航天大学南京航空航天大学王正盛2第一章MATLAB简介MALAB译于矩阵实验室MATrixLABoratory是用来提供通往LINPACK和EISPACK矩阵软件包接口的后来它渐渐发展成了通用科技计算图视…

pointcut 排除_宁河天津玻璃门地弹簧玻璃门故障排除

宁河天津玻璃门地弹簧玻璃门故障排除门扇玻璃应用钢丝卡固定。安装完毕要做好安装后的清洁工作.相关概念钢化玻璃钢化玻璃(Temperedglass/Reinforcedglass)属于安全玻璃。钢化玻璃其实是一种预应力玻璃&#xff0c;为提高玻璃的强度&#xff0c;通常使用化学或物理的方法&#…

四则运算心得

#include<stdio.h>#include<math.h>#include<windows.h>int right0;int wrong0;void add(){int a,b,c;arand()%100;brand()%100;printf("请回答&#xff1a;\n\t\t %d %d ",a,b);scanf("%d",c);if(abc){printf("回答正确!\n"…

php中一级标题和二级标题,什么是一级标题,一二三标题格式举例

什么是一级标题什么是一流的标题&#xff0c;第一级标题是讨论的第一个内容&#xff0c;如序言&#xff1b;一级标题通常指序号为[I&#xff0c;]的标题&#xff0c;也是最大的标题它是4号黑体&#xff0c;单行无标点符号&#xff1b;二级标题是指序号为[(1)]的标题&#xff0c…

mac安装win10_mac制作win10启动盘教程

在Mac系统环境下如何制作win 10 启动盘呢&#xff1f;把win 10 系统安装在U盘里&#xff0c;这样不仅可以重启后单独运行&#xff0c;还可以在Mac的虚拟机里面来引导启动它&#xff0c;那么mac制作win10启动盘工具需要什么软件呢&#xff0c;接下来macdown 小编给大家带来了mac…

cpu工作原理flash动画_17张PLC工作原理动画,每一个都是经典

小编今天给大家带来17张PLC工作原理控制动画&#xff0c;每一个都是经典。1、PLC顺序控制顺序控制的基本思路&#xff0c;即要将设备的动作细分为单个动作步&#xff0c;每个步执行一个操作。且步与步之间通过对应的转换条件连接&#xff0c;及步动作切换。严格按照此思路&…

求合体电脑版_网红界宋祖儿找年轻版言承旭当男友,一张合照收割大量cp粉?!...

下面这组情侣写真&#xff0c;没有颜控能逃得过他们的狗粮。男生神似年轻版言承旭&#xff0c;女生像宋祖儿和章若楠的结合体。一组写真就秒到网友&#xff0c;几乎是全网求ID的程度。说到俊男美女的组合&#xff0c;这不是挖酱的业务范畴么&#xff1f;立马赶来给大家介绍一下…

C++求复数的角度_人教A版高中数学必修二7.1 复数的概念优质课公开课课件、教案...

【新教材】7.1.1 数系的扩充和复数的概念 教学设计(人教A版)教材分析本节作为复数一章的开篇&#xff0c;主要包括数系概念的发展简介&#xff0c;数系的扩充&#xff0c;复数的相关概念、分类、相等条件&#xff0c;代数表示和几何意义.复数的引入是中学阶段数系的又一次扩充&…

电脑屏保海底世界_炸弹测深出来的海底一万米,都藏有何种玄机?

近日&#xff0c;由中国科学院沈阳自动化研究所研制的“海斗一号”全海深自主遥控潜水器载誉归来&#xff0c;在马里亚纳海沟实现4次万米下潜&#xff0c;最大下潜深度10907米&#xff0c;刷新中国潜水器最大下潜深度纪录&#xff0c;众人赞叹“这是一个有‘深度’的潜水器&…

ubuntu安装python_ubuntu18.04下源码编译安装最新版本Python3

原文链接&#xff1a;ubuntu18.04下源码编译安装最新版本Python3截止到2019年4月9日&#xff0c;Python3最新的版本是3.7.3。在ubuntu18.04中已经安装的Python3版本是3.6.7&#xff0c;下面我们就演示一下如何在ubuntu18.04下源码编译安装Python3.7.3&#xff0c;后续如果有更高…

基于Enterprise Library的Winform开发框架实现支持国产达梦数据库的扩展操作

由于一个客户朋友的需求&#xff0c;需要我的Winform开发框架支持国产达梦数据库的操作&#xff0c;这个数据库很早就听过&#xff0c;但是真正一般项目用的很少&#xff0c;一般在一些特殊的项目可能需要用到。由于我的Winform开发框架&#xff0c;是基于Enterprise Library的…

oracle经纬度换算成xy坐标,xy坐标转换经纬度【处置步骤】

很多小伙伴都遇到过xy坐标转换经纬度的困惑吧&#xff0c;一些朋友看过网上零散的xy坐标转换经纬度的处理方法&#xff0c;并没有完完全全明白xy坐标转换经纬度是如何解决的&#xff0c;今天小编准备了简单的解决办法&#xff0c;只需要按照1&#xff1a;一、直角坐标转经纬度(…

零基础不建议学前端_web前端培训心得:零基础怎样学好web前端

转行学web前端&#xff0c;这是不少人的选择&#xff0c;毕竟目前互联网行业受到了太多的关注&#xff0c;而很多人纷纷需要向互联网方面转型。而谈到转型&#xff0c;web前端无疑是很多人的选择&#xff0c;这是因为web前端属于可见即可得的编程语言&#xff0c;写出来就能看到…