HDU 2579 Dating with girls(2) (BFS)
题意:就是一个正常的迷宫,只不过这次石头会每个K步消失一次,即使当时间为K的倍数是,石头就会消失,其他时间又会存在。
思路:在标记时多标记一维,即使该次走后的步数模上K,当为0时石头的部分就可以走,其他情况就不可以走。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<cstdio> #include<algorithm> #include<queue> #include<cstring> using namespace std; struct node{ int x,y,p,step; node(int a,int b,int c,int d){ x=a; y=b; p=c; step=d; } }; char s[105][105]; int vis[105][105][15]; int k,n,m,sx,sy,ex,ey; int fx[]={-1,1,0,0}; int fy[]={0,0,-1,1}; bool in(int x,int y) { return x>=0&&y>=0&&x<n&&y<m; } void bfs(){ memset(vis,0,sizeof(vis)); queue<node> q; q.push(node(sx,sy,0,0)); vis[sx][sy][0]=1; while(!q.empty()){ node u=q.front(); q.pop(); //printf("%d %d %d %d ",u.x,u.y,u.p,u.step); //system("pause"); if(u.x==ex&&u.y==ey){ printf("%d ",u.step); return; } for(int i=0;i<4;i++){ int xx=u.x+fx[i]; int yy=u.y+fy[i]; int pp=(u.p+1)%k; int _step=u.step+1; if(!in(xx,yy)) continue; if(vis[xx][yy][pp]) continue; if(s[xx][yy]!='#'){ vis[xx][yy][pp]=1; q.push(node(xx,yy,pp,_step)); } else if(s[xx][yy]=='#'&&pp==0){ vis[xx][yy][pp]=1; q.push(node(xx,yy,pp,_step)); } } } printf("Please give me another chance! "); } int main(){ int t; scanf("%d",&t); while(t--){ scanf("%d%d%d",&n,&m,&k); for(int i=0;i<n;i++) scanf("%s",&s[i]); for(int i=0;i<n;i++) for(int j=0;j<m;j++){ if(s[i][j]=='Y'){ sx=i; sy=j; } if(s[i][j]=='G'){ ex=i; ey=j; } } bfs(); } return 0; }