https://www.nowcoder.com/question/next?pid=4111169&qid=76262&tid=7218208
大家一定玩過“推箱子”這個經典的遊戲。具體規則就是在一個N*M的地圖上,有1個玩家、1個箱子、1個目的地以及若干障礙,其餘是空地。玩家可以往上下左右4個方向移動,但是不能移動出地圖或者移動到障礙裏去。如果往這個方向移動推到了箱子,箱子也會按這個方向移動一格,當然,箱子也不能被推出地圖或推到障礙裏。當箱子被推到目的地以後,遊戲目標達成。現在告訴你遊戲開始是初始的地圖佈局,請你求出玩家最少需要移動多少步才能夠將遊戲目標達成。
輸入描述:
每個測試輸入包含1個測試用例 第一行輸入兩個數字N,M表示地圖的大小。其中0<N,M<=8。 接下來有N行,每行包含M個字符表示該行地圖。其中 . 表示空地、X表示玩家、*表示箱子、#表示障礙、@表示目的地。 每個地圖必定包含1個玩家、1個箱子、1個目的地。
輸出描述:
輸出一個數字表示玩家最少需要移動多少步才能將遊戲目標達成。當無論如何達成不了的時候,輸出-1。
輸入例子:
4 4 .... ..*@ .... .X.. 6 6 ...#.. ...... #*##.. ..##.# ..X... .@#...
輸出例子:
3 11
一看就是一個bfs的題,按着模版慢慢寫,然後發現不知道該怎麼處理最後到不了的情況。
靈光一現,只要再設置一個數組,記錄此時人的位置和箱子的位置,如果這個位置已經出現過了,則跳過~也就是我的f[10][10][10][10].
#include<bits/stdc++.h>
using namespace std;
int n,m;
char s[10][10];
int px,py;
struct node{
int x,y,cnt,sx,sy;
bool friend operator < (node a,node b)
{
return a.cnt>b.cnt;
}
};
int f[10][10][10][10];
node start;
int endx,endy;
int xx[4]={0,0,1,-1};
int yy[4]={1,-1,0,0};
void bfs()
{
priority_queue<node> q;
node c;
c.x=px;
c.y=py;
c.sx=start.x;
c.sy=start.y;
c.cnt=0;
q.push(c);
f[px][py][c.sx][c.sy]=1;
int flag=0;
while(!q.empty())
{
node d=q.top();
q.pop();
if(d.sx==endx&&d.sy==endy)
{
printf("%d\n",d.cnt);
return ;
}
for(int i=0;i<4;i++)
{
c.x=d.x+xx[i];
c.y=d.y+yy[i];
c.cnt=d.cnt+1;
if(s[c.x][c.y]=='#')
{
continue;
}
if(c.x==d.sx&&c.y==d.sy)
{
if(s[c.x+xx[i]][c.y+yy[i]]=='#')
{
continue;
}
if(c.x+xx[i]>=0&&c.x+xx[i]<n&&c.y+yy[i]>=0&&c.y+yy[i]<m)
{
c.sx=c.x+xx[i];
c.sy=c.y+yy[i];
if(f[c.x][c.y][c.sx][c.sy]==1)
{
continue;
}
f[c.x][c.y][c.sx][c.sy]=1;
q.push(c);
}
}
else
{
if(c.x>=0&&c.x<n&&c.y>=0&&c.y<m)
{
c.sx=d.sx;
c.sy=d.sy;
if(f[c.x][c.y][c.sx][c.sy]==1)
{
continue;
}
f[c.x][c.y][c.sx][c.sy]=1;
q.push(c);
}
}
}
}
printf("-1\n");
}
int main()
{
scanf("%d%d",&n,&m);
memset(f,0,sizeof(f));
for(int i=0;i<n;i++)
{
scanf("%s",s[i]);
for(int j=0;j<m;j++)
{
if(s[i][j]=='X')
{
px=i;
py=j;
}
if(s[i][j]=='*')
{
start.x=i;
start.y=j;
}
if(s[i][j]=='@')
{
endx=i;
endy=j;
}
}
}
bfs();
return 0;
}