编程题——推箱子
来源:互联网 发布:虚拟机上ubuntu服务器 编辑:程序博客网 时间:2024/06/05 22:48
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....@#...
输出例子:
311
一看就是一个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;
}
- 编程题——推箱子
- [编程题]推箱子
- [编程题] 推箱子
- [编程题] 推箱子
- [编程题] 推箱子
- 编程笔试——推箱子
- 推箱子游戏———DELPHI
- HDU 1254—— 推箱子
- HDU 1254——推箱子
- Greenfoot游戏——推箱子
- C语言——推箱子
- 算法题--推箱子
- 网易笔试题 推箱子
- win32GDI函数编程实现推箱子小游戏
- win32GDI位图编程实现推箱子小游戏
- 自己动手写推箱子游戏——界面(源码)
- 自己动手写推箱子游戏——菜单(源码)
- 自己动手写推箱子游戏——设计师(源码)
- 博客网站(7)-博客的主页面及文章内容页面
- 初来博客
- Installation failed with message Failed to establish session(小米手机)
- B1015. 德才论 (25)
- stick
- 编程题——推箱子
- 纯HTML+CSS+JQUERY的响应式导航
- webview系列:Html5页面和Native App怎么进行交互
- mybatis的学习总结(一)
- cod5565二叉苹果树
- 深入浅出JMS(三)--ActiveMQ简单的HelloWorld实例
- vue2.0 v-bind的用法
- 折线分割平面
- 如何安装使用多个版本的Python