hdu 1254 推箱子
来源:互联网 发布:淘宝延长收货多久 编辑:程序博客网 时间:2024/06/02 21:42
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1254
首先按箱子进行BFS. 然后判断箱子所走方向的反面,人是否能到达,即对人进行DFS。。
下面是 AC代码:
#include<iostream>#include<cstring>#include<queue>using namespace std;const int MAX = 10;int map[MAX][MAX];int dir[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};int other_dir[4][2] = {{0,-1},{-1,0},{0,1},{1,0}}; //反方向bool vis[MAX][MAX][MAX][MAX];bool mark[MAX][MAX];int flag,ans;struct node{ int ps_x,ps_y; int bk_x,bk_y; int step; int cur_map[MAX][MAX];} s_pos;int end_x,end_y;int m,n;void init(){ s_pos.step=0; for(int i=0; i<m; i++) for(int j=0; j<n; j++) { if(map[i][j]==2) s_pos.bk_x=i, s_pos.bk_y=j; else if(map[i][j]==3) end_x=i,end_y=j; else if(map[i][j]==4) s_pos.ps_x=i, s_pos.ps_y=j; s_pos.cur_map[i][j]=map[i][j]; } memset(vis,0,sizeof(vis));}bool cheak(int x,int y){ if(x>=0&&x<m&&y>=0&&y<n&&map[x][y]!=1) return true; return false;}int can;void dfs(int p_x,int p_y,int b_x,int b_y,int now_map[10][10]) //判断人能否到达箱子的旁边{ if(can) return ; if(p_x==b_x&&p_y==b_y) { can=1; return ;}//cout<<p_x<<" "<<p_y<<endl; for(int i=0; i<4; i++){ int x=p_x+dir[i][0], y=p_y+dir[i][1]; if(cheak(x,y)&&now_map[x][y]!=2&&!mark[x][y]){ mark[x][y]=true; dfs(x,y,b_x,b_y,now_map; mark[x][y]=false; } }}void bfs(){ init(); queue<node > q; vis[s_pos.bk_x][s_pos.bk_y][s_pos.ps_x][s_pos.ps_y]=true; q.push(s_pos); while(!q.empty()){ node now = q.front(); q.pop(); if(now.bk_x==end_x&&now.bk_y==end_y){ flag=1,ans=now.step; return ; } for(int i=0; i<4; i++){ node next=now; next.bk_x+=dir[i][0], next.bk_y+=dir[i][1];next.step+=1; int x=now.bk_x+other_dir[i][0],y=now.bk_y+other_dir[i][1]; if(cheak(x,y)&&cheak(next.bk_x,next.bk_y)&&!vis[next.bk_x][next.bk_y][now.bk_x][now.bk_y]) { memset(mark,0,sizeof(mark)); mark[next.ps_x][next.ps_y]=true; can=0; dfs(next.ps_x,next.ps_y,x,y,now.cur_map); if(can){ vis[next.bk_x][next.bk_y][now.bk_x][now.bk_y]=true; // cout<<next.bk_x<<" "<<next.bk_y<<endl; next.ps_x=now.bk_x; next.ps_y=now.bk_y; next.cur_map[next.bk_x][next.bk_y]=2; next.cur_map[now.bk_x][now.bk_y]=0; q.push(next); } } } }}int main(){ int t,i,j; cin>>t; while(t--) { cin>>m>>n; for(i=0; i<m; i++) for(j=0; j<n; j++) cin>>map[i][j]; flag=0; ans=-1; bfs(); if(flag) cout<<ans<<endl; else cout<<-1<<endl; } return 0;}
- HDU 1254 推箱子
- HDU 1254 推箱子
- HDU 1254 推箱子
- hdu 1254 推箱子
- hdu 1254 推箱子
- hdu 1254 推箱子
- hdu 1254 推箱子
- hdu 1254 推箱子
- hdu 1254 推箱子
- HDU 1254 推箱子
- HDU 1254 推箱子
- HDU 1254 推箱子
- hdu 1254 推箱子
- hdu 1254 推箱子
- HDU 1254推箱子
- hdu 1254 推箱子
- hdu 1254 推箱子
- HDU 1254 推箱子
- 强化站内SEO做好网站基础
- ProtocolBuffer和lzo技术Hadoop系统上的使用
- 关于设计问题的总结-from 《code complete 2》
- JavaScript取当前时间,格式为,yyyy-mm-dd hh:mm:ss
- poj1325 最小顶点覆盖 konig定理
- hdu 1254 推箱子
- struts2第一个HelloWorld项目
- 零基础学Qt4编程之Qt核心机制与原理之信号与槽
- linux进程地址空间--vma的基本操作
- Java实现抓取相应地区中央天气预报
- 写一个自己的游戏引擎
- 后缀数组小结
- poj1422最小路径覆盖
- 第04章 异常处理 02 异常的概念2