[编程题] 推箱子
来源:互联网 发布:图灵程序设计丛书 java 编辑:程序博客网 时间:2024/05/16 17:39
[编程题] 推箱子
时间限制:1秒
空间限制:32768K
大家一定玩过“推箱子”这个经典的游戏。具体规则就是在一个N*M的地图上,有1个玩家、1个箱子、1个目的地以及若干障碍,其余是空地。玩家可以往上下左右4个方向移动,但是不能移动出地图或者移动到障碍里去。如果往这个方向移动推到了箱子,箱子也会按这个方向移动一格,当然,箱子也不能被推出地图或推到障碍里。当箱子被推到目的地以后,游戏目标达成。现在告诉你游戏开始是初始的地图布局,请你求出玩家最少需要移动多少步才能够将游戏目标达成。
输入描述:
每个测试输入包含1个测试用例第一行输入两个数字N,M表示地图的大小。其中0<N,M<=8。接下来有N行,每行包含M个字符表示该行地图。其中 . 表示空地、X表示玩家、*表示箱子、#表示障碍、@表示目的地。每个地图必定包含1个玩家、1个箱子、1个目的地。
输出描述:
输出一个数字表示玩家最少需要移动多少步才能将游戏目标达成。当无论如何达成不了的时候,输出-1。
输入例子1:
4 4......*@.....X..6 6...#........#*##....##.#..X....@#...
输出例子1:
311
第一眼看有点恶心。。之后想了下发现还是很简单,图很小,状压都用不到。直接维护人的位置和箱子位置
#include <iostream>#include <algorithm>#include <vector>#include <cstring>#include <queue>using namespace std;typedef long long ll;char mp[10][10];int vis[10][10][10][10];int data[4][2]={0,1,0,-1,1,0,-1,0}; int n,m;struct node{ int x,y,step; int xx,yy; node(int _x,int _y,int _step,int _xx,int _yy){x=_x,y=_y,step=_step,xx=_xx,yy=_yy;}};int bfs(int sxx,int syy,int sx,int sy){ queue<node> q; q.push(node(sx,sy,0,sxx,syy)); while(!q.empty()) { node s=q.front(); q.pop(); vis[s.x][s.y][s.xx][s.yy]=1; //cout<<s.x <<" "<<s.y<<" "<<s.xx<<" "<<s.yy<<" "<<s.step<<endl; if(mp[s.xx][s.yy]=='@') return s.step; for(int i=0;i<4;i++){ node tmp=s; tmp.step++; tmp.x+=data[i][0]; tmp.y+=data[i][1]; if(tmp.x>n||tmp.y>m||tmp.x<1||tmp.y<1) continue; if(mp[tmp.x][tmp.y]=='#') continue; if(tmp.x==tmp.xx&&tmp.y==tmp.yy) tmp.xx+=data[i][0],tmp.yy+=data[i][1]; if(tmp.xx>n||tmp.yy>m||tmp.xx<1||tmp.yy<1) continue; if(mp[tmp.xx][tmp.yy]=='#') continue; if(vis[tmp.x][tmp.y][tmp.xx][tmp.yy]!=1) q.push(tmp); } } return -1;}int main(){ cin>>n>>m; for(int i=1;i<=n;i++) cin>>&mp[i][1]; int sx,sy,xx,yy; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(mp[i][j]=='X') sx=i,sy=j; if(mp[i][j]=='*') xx=i,yy=j; } } cout<<bfs(xx,yy,sx,sy)<<endl;}/*3 3#.X#*.@..*/
阅读全文
0 0
- [编程题]推箱子
- [编程题] 推箱子
- [编程题] 推箱子
- [编程题] 推箱子
- 编程题——推箱子
- 算法题--推箱子
- 网易笔试题 推箱子
- win32GDI函数编程实现推箱子小游戏
- win32GDI位图编程实现推箱子小游戏
- 编程笔试——推箱子
- 推箱子
- 推箱子
- 推箱子
- 推箱子
- 推箱子
- 推箱子
- 推箱子
- 推箱子
- Leetcode 算法题10
- c猜数字游戏
- 温湿度传感器之DHT11
- 使用VS2017调试Linux C++代码
- 奥数题-求空间4点构成的四面体体积
- [编程题] 推箱子
- 6.17 这几道题都一样 都不想做了
- file_paths文件的创建(可能是一篇废话的博客)
- 基于centos7部署监控利器Zabbix
- if,for语句
- apache pool 对象池
- 防守打法
- 是否二叉搜索树(25 分)
- poj 1018 Communication System