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…

java漂亮界面编程_计算机二级之JAVA篇

JavaJava是一门面向对象编程语言&#xff0c;不仅吸收了C语言的各种优点&#xff0c;还摒弃了C里难以理解的多继承、指针等概念&#xff0c;因此Java语言具有功能强大和简单易用两个特征。深受程序员们的追捧&#xff0c;据TIBOE2020年最新统计&#xff1a;Java使用人数大涨&am…

idea 设置java栈空间,如何为Intellij编译器提供更多堆空间?

当我创建一个Intellij项目时&#xff0c;我不断收到以下内存错误。我已经在idea.vmoptions中增加了我的堆大小&#xff1a;-Xms128m-Xmx2048m-XX:MaxPermSize1024m-XX:ReservedCodeCacheSize64m-ea但我仍然得到这个错误&#xff1a;Information:The system is out of resources…

Java for LeetCode 042 Trapping Rain Water

Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining. For example, Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6. 解题思路&#xff1a; 先找到第一块最高的木板&…

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

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

自梦php,PHP菜狗自学之路 云之梦php php之窗 php脚本之

第一讲 开启PHP学习之路 2016/5/2 20:29PHP可以做什么&#xff1f; www网站 管理系统&#xff1b; websever wap网站第二讲 PHP的数据类型 源码调试 2016/5/2 20:30PHP和htm混编 句子以 ; 英文半角分号结束~&#xff01;&#xff01;在PHP中 以 开始 以?>结束&#xff1b;e…

鸡啄米vc++2010系列2(项目文件分析)

用应用程序向导生成框架程序后&#xff0c;我们可以在之前设置的Location下看到以解决方案名命名的文件夹&#xff0c;此文件夹中包含了几个文件和一个以工程名命名的子文件夹&#xff0c;这个子文件夹中又包含了若干个文件和一个res文件夹&#xff0c;创建工程时的选项不同&am…

python代做在哪找靠谱_比较靠谱的资产评估师考试去哪找

比较靠谱的资产评估师考试去哪找二我们一起来看看考研辅导员们哪些为优质的学习资源。考研辅导员们怎么说您好&#xff0c;我想作为有识之士&#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…

序列

ORACLE创建序列语句CREATE SEQUENCE 序列名 increment by (序列步长) start with &#xff08;序列起始值&#xff09; maxvalue &#xff08;序列最大值&#xff09; 删除序列DROP SEQUENCE 序列名 得到序列的下一个值序列名.nextval 创建和使用序列的例子CREATE SEQUENCE seq…

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

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

html5 支持php标签吗,HTML5新增标签使用方法

HTML5提供了一些新的元素和属性&#xff0c;例如nav(网站导航块)和footer。这种标签将有利于搜索引擎的索引整理&#xff0c;同时更好的帮助小屏幕装置和视障人士使用&#xff0c;除此之外&#xff0c;还为其他浏览要素提供了新的功能&#xff0c;如audio和video标记。下面我们…

面试常考题---交换变量

1 面试常考的试题&#xff1a;(交换两个变量值&#xff0c;不使用第三方变量)2 方法1&#xff1a; int n150;3 int n230;4 //最终结果n130 n2505 6 n1n1-n2;//n120 n2307 n2n1n2;//n250 n1208 n1n2-n1;//n130 n2509 10 11 12 方法2&#xff1a; int n150; 13 int n23…

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

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

html5 php idea,五个HTML5新特性

###特性一&#xff1a;正则表达式 通过使用HTML5的pattern属性&#xff0c;代码如下&#xff1a; ###特性二&#xff1a;数据列表元素 使用一些JS或者jQuery UI来实现自动补齐的功能&#xff0c;而在HTML5中&#xff0c;直接使用datalist元素&#xff0c;如下&#xff1a; ###…

iOS学习之UItableView

一些相关的总结,有点乱. UITableView是iOS中提供的用来以列的形式展示数据的视图,叫做表现图,但是只有一列,而且只能在垂直方向滚动.继承自UIScrollView. UITableView由多个分区组成(相当于班级的分组),每个分区由多行组成(相当于每个分组下的人). UITableView有两种样式,Plain…

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

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

线性回归的Spark实现 [Linear Regression / Machine Learning / Spark]

1- 问题提出 2- 线性回归 3- 理论推导 4- Python/Spark实现 1 # -*- coding: utf-8 -*-2 from pyspark import SparkContext3 4 5 theta [0, 0]6 alpha 0.0017 8 sc SparkContext(local)9 10 def func_theta_x(x): 11 return sum([i * j for i, j in zip(theta, x)]) 1…

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

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