HDU 1254 推箱子 搜尋中搜尋

2021-07-24 13:44:59 字數 2239 閱讀 8040

problem description

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

現在給定房間的結構,箱子的位置,搬運工的位置和箱子要被推去的位置,請你計算出搬運工至少要推動箱子多少格.

輸入資料的第一行是乙個整數t(1<=t<=20),代表測試資料的數量.然後是t組測試資料,每組測試資料的第一行是兩個正整數m,n(2<=m,n<=7),代表房間的大小,然後是乙個m行n列的矩陣,代表房間的布局,其中0代表空的地板,1代表牆,2代表箱子的起始位置,3代表箱子要被推去的位置,4代表搬運工的起始位置.

output

對於每組測試資料,輸出搬運工最少需要推動箱子多少格才能幫箱子推到指定位置,如果不能推到指定位置則輸出-1.

sample input

1

5 50 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

題解:題目要求計算箱子所需的最小步數,而不是人的。

①:每次移動箱子時,就要考慮人能否到達箱子的後面,這樣,箱子才能被往前推。

②:在判斷人是否能到達箱子的後面時要注意此時人不能走到箱子的位置,也就是每次移動箱子時,

就要把現在箱子的位置標記為人不能通過,待判斷完後,再取消剛才對箱子的標記。

③:接著是考慮箱子能否往回走,實際上對於每一點時,箱子可重複走到,但從每個方向走到乙個點時只能走一次。

所以需要乙個陣列來進行判斷箱子是不是已經從這個方向走過這個點了。

如0 0 0 1 0 0

0 0 0 1 0 3 

0 0 0 2 4 0

0 0 0 1 0 0

0 0 0 1 0 0 

此時就需要重複走到一點 但是方向不同

#include "stdio.h"

#include "queue"

#include "string.h"

using namespace std;

int vis[15][15][4];

int kk,n,m;

int map[10][10];

struct pnode

;struct node

; pnode startp,startb,targetb;

int dir[4][2] = ;//上下左右

int bfs_person(pnode a,pnode b) // 平常的搜尋

for(i=0;i<4;i++)

{ next.x = now.x + dir[i][0];

next.y = now.y + dir[i][1];

if(next.x>=0&&next.x=0&&next.yq;

node now,next;

now.x=startb.x;

now.y=startb.y;

now.step=0;

now.person.x=startp.x;

now.person.y=startp.y;

q.push(now);

pnode pf ;// 人要到箱子的前面;

while (!q.empty())

{ now=q.front();

q.pop();

if( now.x==targetb.x && now.y==targetb.y )

return now.step;

for(i=0;i<4;i++)

{ next.x = now.x + dir[i][0];

next.y = now.y + dir[i][1];

pf.x = now.x - dir[i][0]; //

pf.y = now.y - dir[i][1]; // 推箱子的人需要到的地方

if(next.x>=0&&next.x=0&&next.y

HDU 1254 推箱子(搜尋)

by cxlove 以前就做過的一題,重溫一下 推箱子遊戲,首先廣搜箱子的路徑,每一次移動都要判斷人是否能到達指定位置 bfs,dfs都行 我採用兩次bfs解決問題 在箱子的移動中,判重的時候需要乙個三維陣列,箱子從不同方向過來,人的位置是不一樣的,也就意味著狀態不一樣 id cxlove incl...

hdu 1254 推箱子遊戲

這個題目我就不說,鏈結在這裡 主要我想說的是,一開始是我用2個三圍陣列來分別標記人和箱子走過的四個方向,但不知怎麼回事行不通。於是就用乙個四維陣列來標記狀態,嘻嘻,過了。好吧,還是直接上 了。1 include2 include3 include4 5using namespace std 6int...

hdu 1254 推箱子遊戲

這個題目我就不說,鏈結在這裡 主要我想說的是,一開始是我用2個三圍陣列來分別標記人和箱子走過的四個方向,但不知怎麼回事行不通。於是就用乙個四維陣列來標記狀態,嘻嘻,過了。好吧,還是直接上 了。1 include2 include3 include4 5using namespace std 6int...