1. 程式人生 > >題解: HDU 1254 :推箱子 (BFS)

題解: HDU 1254 :推箱子 (BFS)

上題目

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.人的下一個位置是箱子現在的位置

2.箱子移動的方向是人推箱子時移動的方向

  1. 人和箱子說組成的四維座標是用來判斷是否經歷的依據

上程式碼 + 註釋

#include<stdio.h> 
#include<queue> 
#include<algorithm> using namespace std; struct Node { int x, y; int bx, by; int num; bool friend operator < (const Node &a, const Node &b) { return a.num > b.num; }//優先佇列 } star; int map[9][9]; bool mark[9][9][9][9];//用人跟箱子的位置標記狀態 int dis[4][2] = { 1
, 0, 0, -1, -1, 0, 0, 1 }; int n, m, ans; void input()// 輸入函式 { int i, j; for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { scanf("%d", &map[i][j]); if (map[i][j] == 4) { star.x = i; star.y = j; map[i][j] = 0; } if (map[i][j] == 2) { star.bx = i; star.by = j; map[i][j] = 0; } } } } //輸入地圖,找到人跟位置的點。 int BFS() { int i, x, y, num, xx, yy; Node now, next; priority_queue<Node> Q; Q.push(star); mark[star.x][star.y][star.bx][star.by] = true; while (!Q.empty()) { now = Q.top(); Q.pop(); if (map[now.bx][now.by] == 3) return now.num;//如果箱子到終點退出搜尋 for (i = 0; i < 4; i++)//四個方向迴圈 { x = now.x + dis[i][0]; y = now.y + dis[i][1]; if (x < 0 || x >= n || y < 0 || y >= m)//越界 繼續 continue; if (map[x][y] == 1) //牆 繼續 continue; next.bx = now.bx; next.by = now.by; next.num = now.num; //注意題目要求統計的是箱子的移動個數 next.x = x; next.y = y; if (x == now.bx && y == now.by)//如果下個點是箱子的位置 { xx = x + dis[i][0]; yy = y + dis[i][1]; if (xx < 0 || xx >= n || yy < 0 || yy >= m) continue; if (map[xx][yy] == 1) continue; next.bx = xx; next.by = yy; next.num++; } if (mark[x][y][next.bx][next.by])//如果推完後的狀態已經經歷過就不推了 continue; mark[x][y][next.bx][next.by] = true; Q.push(next); } } return -1; } int main() { int T, ans; scanf("%d", &T); while (T--) { memset(mark, 0, sizeof(mark));//最重要的初始話忘記了,wa了幾次 scanf("%d%d", &n, &m); input(); star.num = 0; ans = BFS(); printf("%d\n", ans); } return 0; }

相關推薦

題解 HDU 1254 箱子 BFS

上題目 Problem Description 推箱子是一個很經典的遊戲.今天我們來玩一個簡單版本.在一個M*N的房間裡有一個箱子和一個搬運工,搬運工的工作就是把箱子推到指定的位置,注意,搬運工只能推箱子而不能拉箱子,因此如果箱子被推到一個角上(如

hdu 1254 箱子 BFS

#include <iostream> #include <queue> #include <algorithm> using namespace std; const int maxn = 10; int a[maxn][maxn]; int n, m; i

1254箱子 bfs

題幹: 推箱子是一個很經典的遊戲.今天我們來玩一個簡單版本.在一個M*N的房間裡有一個箱子和一個搬運工,搬運工的工作就是把箱子推到指定的位置,注意,搬運工只能推箱子而不能拉箱子,因此如果箱子被推到一個角上(如圖2)那麼箱子就不能再被移動了,如果箱子被推到一面牆上,那麼箱子只

hdu1254 箱子bfs+bfs

推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6386 Accepted Submission(s): 18

HDU-1253-勝利大逃亡bfs

                                           勝利大逃亡 Problem Description Ignatius被魔王抓走了,有一天魔王出差去了,這可是Ignatius逃亡的好機會. 魔王住在一個城堡裡,城堡是一個A*B*C的立方

題解報告hdu 2087 剪花布條KMP入門

不變 indent spa bottom fix href pac transform eight 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2087 Problem Description 一塊花布條,裏面有些圖案,另有

題解報告hdu 1564 Play a game找規律博弈

正整數 lse CI character square placed eight 技術 分享 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1564 Problem Description New Year is Coming

題解報告hdu 2516 取石子遊戲斐波那契博弈

csdn 數組 pre lse http 根據 代碼 als names 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2516 Problem Description 1堆石子有n個,兩人輪流取.先取者第1次可以取任意多個,

題解報告hdu 1698 Just a Hook線段樹lazy標記的運用

http som height sum cup ive first 報告 original Problem Description In the game of DotA, Pudge’s meat hook is actually the most horrible th

題解報告poj 3669 Meteor Showerbfs

hat oca sam output ace for family gre mov Description Bessie hears that an extraordinary meteor shower is coming; reports say that these

題解報告poj 2533 Longest Ordered SubsequenceLIS

where line poj 2533 output bound poj must 問題 iostream Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let

GitHub學習Phpstorm中的git使用1--建立本地倉庫與

這段時間在學php的laravel框架,用的開發軟體是xampp建站整合軟體和phpstorm,前幾天做完了表單處理工程,因為上班和在家用的是兩臺電腦,所以需要用github來儲存程式碼,在這裡記錄下phpstorm中的git使用,以免以後忘了。 我已經寫了一部分的程式碼的工程,我現在的第一步就是

1小時學會最簡單的iOS直播yuv、pcm資料的介紹和獲取

最簡單的iOS 推流程式碼,視訊捕獲,軟編碼(faac,x264),硬編碼(aac,h264),美顏,flv編碼,rtmp協議,陸續更新程式碼解析,你想學的知識這裡都有,願意懂直播技術的同學快來看!! 前面介紹瞭如何通過相機實時獲取音視訊資

1小時學會最簡單的iOS直播h264/aac 硬編碼

最簡單的iOS 推流程式碼,視訊捕獲,軟編碼(faac,x264),硬編碼(aac,h264),美顏,flv編碼,rtmp協議,陸續更新程式碼解析,你想學的知識這裡都有,願意懂直播技術的同學快來看!! 前面已經介紹瞭如何從硬體裝置獲取到音視

1小時學會最簡單的iOS直播flv 編碼與音視訊時間戳同步

最簡單的iOS 推流程式碼,視訊捕獲,軟編碼(faac,x264),硬編碼(aac,h264),美顏,flv編碼,rtmp協議,陸續更新程式碼解析,你想學的知識這裡都有,願意懂直播技術的同學快來看!! 前文介紹瞭如何獲取音視訊的aac/h2

1254 箱子標記狀態,思路

推箱子是一個很經典的遊戲.今天我們來玩一個簡單版本.在一個M*N的房間裡有一個箱子和一個搬運工,搬運工的工作就是把箱子推到指定的位置,注意,搬運工只能推箱子而不能拉箱子,因此如果箱子被推到一個角上(如圖2)那麼箱子就不能再被移動了,如果箱子被推到一面牆上,那麼箱子只能沿著牆移

hdu 1254 箱子 雙層bfs

#include <cstdio> #include <cstring> #include <cmath> #include <queue> #include <iostream> #include <alg

AngularJS 1.x系列AngularJS簡介及第一個應用2

ref http 源碼 1.2 lar div targe all clas 1. 安裝AngularJS 1.1 AngularJS官網   Github源碼:https://github.com/angular/angular.js   官網:https://an

白話空間統計之五空間關系的概念化

能夠 每一個 corners 計算 感覺 行政區劃 -a -s sim 空間關系的概念化(中) 上文說的兩種空間關系概念化盡管是最經常使用,可是總給人一種簡單粗暴的感覺,所以業界和學術界由搞出了各種各樣的空間關系概念化的模型。 首先,就是把兩種最簡單的概念化給組

5.27cocos2d-x初探學習筆記2--重要概念及Test樣例結構(轉)

這樣的 發生 菜單 add css 基礎 dsm 人的 添加 1.幾個重要概念 在cocos2d引擎中,有幾個概念,各自是導演。場景,布景和人物角色。 導演(CCDirector):在cocos2d-x引擎中,導演類是遊戲的組織者和領導者。導演制定規則讓遊戲內的場