首页 > 代码库 > hdu 1732 Push Box
hdu 1732 Push Box
http://acm.hdu.edu.cn/showproblem.php?pid=1732
推箱子和游戏规则一样。
1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 #include <algorithm> 5 using namespace std; 6 7 char g[10][10]; 8 int n,m; 9 int sx,sy; 10 bool vis[9][9][9][9][9][9][9][9]; 11 int dir[4][2]= {{0,1},{0,-1},{1,0},{-1,0}}; 12 struct node 13 { 14 int x[4],y[4],xx,yy,step; 15 } st1,st2,st; 16 17 int deal(node p,int i,int pos) 18 { 19 p.xx+=dir[i][0]; 20 p.yy+=dir[i][1]; 21 if(p.xx>=0&&p.xx<n&&p.yy>=0&&p.yy<m) 22 { 23 for(int j=0; j<3; j++) 24 { 25 if(j!=pos&&p.x[j]==p.xx&&p.y[j]==p.yy) 26 { 27 return 0; 28 } 29 } 30 return 1; 31 } 32 return 0; 33 } 34 35 int bfs() 36 { 37 queue<node>q; 38 st.step=0; 39 st.xx=sx; 40 st.yy=sy; 41 q.push(st); 42 memset(vis,false,sizeof(vis)); 43 vis[sx][sy][st.x[0]][st.y[0]][st.x[1]][st.y[1]][st.x[2]][st.y[2]]=true; 44 while(!q.empty()) 45 { 46 st1=q.front(); 47 q.pop(); 48 int cnt=0; 49 for(int i=0; i<3; i++) 50 { 51 if(g[st1.x[i]][st1.y[i]]==‘@‘) 52 { 53 cnt++; 54 } 55 } 56 if(cnt==3) 57 { 58 return st1.step; 59 } 60 for(int i=0; i<4; i++) 61 { 62 st2=st1; 63 st2.xx=st2.xx+dir[i][0]; 64 st2.yy=st2.yy+dir[i][1]; 65 st2.step++; 66 if(st2.xx>=0&&st2.xx<n&&st2.yy>=0&&st2.yy<m&&g[st2.xx][st2.yy]!=‘#‘) 67 { 68 int pos; 69 for(pos=0; pos<3; pos++) 70 { 71 if(st2.x[pos]==st2.xx&&st2.y[pos]==st2.yy) 72 { 73 break; 74 } 75 } 76 if(pos<3) 77 { 78 if(deal(st2,i,pos)) 79 { 80 st2.x[pos]+=dir[i][0]; 81 st2.y[pos]+=dir[i][1]; 82 if(!vis[st2.xx][st2.yy][st2.x[0]][st2.y[0]][st2.x[1]][st2.y[1]][st2.x[2]][st2.y[2]]) 83 { 84 vis[st2.xx][st2.yy][st2.x[0]][st2.y[0]][st2.x[1]][st2.y[1]][st2.x[2]][st2.y[2]]=true; 85 q.push(st2); 86 } 87 } 88 } 89 else 90 { 91 if(!vis[st2.xx][st2.yy][st2.x[0]][st2.y[0]][st2.x[1]][st2.y[1]][st2.x[2]][st2.y[2]]) 92 { 93 vis[st2.xx][st2.yy][st2.x[0]][st2.y[0]][st2.x[1]][st2.y[1]][st2.x[2]][st2.y[2]]=true; 94 q.push(st2); 95 } 96 } 97 } 98 } 99 }100 return -1;101 }102 103 int main()104 {105 while(scanf("%d%d",&n,&m)!=EOF)106 {107 int num=0;108 for(int i=0; i<n; i++)109 {110 scanf("%s",g[i]);111 for(int j=0; j<m; j++)112 {113 if(g[i][j]==‘X‘)114 {115 g[i][j]=‘.‘;116 sx=i;117 sy=j;118 }119 else if(g[i][j]==‘*‘)120 {121 g[i][j]=‘.‘;122 st.x[num]=i;123 st.y[num]=j;124 num++;125 }126 }127 }128 printf("%d\n",bfs());129 }130 return 0;131 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。