題解: 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.箱子移動的方向是人推箱子時移動的方向
- 人和箱子說組成的四維座標是用來判斷是否經歷的依據
上程式碼 + 註釋
#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 Shower(bfs)
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 Subsequence(LIS)
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.27:cocos2d-x初探學習筆記(2)--重要概念及Test樣例結構(轉)
這樣的 發生 菜單 add css 基礎 dsm 人的 添加 1.幾個重要概念 在cocos2d引擎中,有幾個概念,各自是導演。場景,布景和人物角色。 導演(CCDirector):在cocos2d-x引擎中,導演類是遊戲的組織者和領導者。導演制定規則讓遊戲內的場