HDU 3085

http://acm.hdu.edu.cn/showproblem.php?pid=3085

题意:简单英文。。不在累赘。。。

一点值得注意的,鬼魅先走,mm与gg后走,直接模拟这个这个场景,突出时间的先后性,一秒与一秒的区别。。。这样模拟很难出错。。。。不知道怎么写。。呵呵 居然跑到HDU的第一去了。。。呵呵。。

代码:

#include<stdio.h> const int N = 801 ; char maze[N][N]; int n,m,mx,my,gx,gy,indx,goalx,goaly; int _x[] = {0,-1,0,1} ; int _y[] = {-1,0,1,0} ; struct node { int x,y; }zz[N*N],gg[N*N],mm[N*N]; int bfs() { gg[0].x = gx , gg[0].y = gy ; mm[0].x = mx , mm[0].y = my ; int t=0,sign,tmp,head1=0,head2=0,head3=0,tail1=1,tail2=1, tail3=indx; while(head1<tail1&&head2<tail2) { t ++ ; for(int i=0;i<2;i++) { tmp = tail3 ; for(int k=head3;k<tmp;k++) { for(int j=0;j<4;j++) { int x = zz[k].x + _x[j] ; int y = zz[k].y + _y[j] ; if(x<0||x>=n||y<0||y>=m||maze[x][y]=='Z') continue ; maze[x][y] = 'Z' ; zz[tail3].x = x , zz[tail3++].y = y ; } } head3 = tmp ; } tmp = tail1 ; for(int k=head1;k<tmp;k++) { if(maze[gg[k].x][gg[k].y]=='Z') continue ; for(int j=0;j<4;j++) { int x = gg[k].x + _x[j] ; int y = gg[k].y + _y[j] ; if(x<0||x>=n||y<0||y>=m||maze[x][y]=='Z'||maze[x][y]=='X'||maze[x][y]=='G') continue ; sign = 1 ; if(maze[x][y]=='M') { return t ; } maze[x][y] = 'G' ; gg[tail1].x = x , gg[tail1++].y = y ; } } head1 = tmp ; for(int i=0;i<3;i++) { tmp = tail2 ; for(int k=head2;k<tmp;k++) { if(maze[mm[k].x][mm[k].y]=='Z') continue ; for(int j=0;j<4;j++) { int x = mm[k].x + _x[j] ; int y = mm[k].y + _y[j] ; if(x<0||x>=n||y<0||y>=m||maze[x][y]=='Z'||maze[x][y]=='X'||maze[x][y]=='M') continue ; if(maze[x][y]=='G') { return t ; } maze[x][y] = 'M' ; mm[tail2].x = x , mm[tail2++].y = y ; } } head2 = tmp ; } } return -1 ; } int main() { int cas ; scanf("%d",&cas); while(cas--) { scanf("%d%d",&n,&m); indx = 0 ; for(int i=0;i<n;i++) { scanf("%s",&maze[i]); for(int j=0;j<m;j++) { if(maze[i][j]=='G') gx =i , gy =j ; else if(maze[i][j]=='M'){ mx =i , my =j ; }else if(maze[i][j]=='Z') { zz[indx].x = i , zz[indx++].y = j ; } } } printf("%d/n",bfs()); } return 0 ; }

你可能感兴趣的:(struct,ini)