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

 

你可能感兴趣的:(push)