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 }
View Code

 

posted @ 2014-08-02 16:36  null1019  阅读(388)  评论(0编辑  收藏  举报