2016暑假集训补题系列——HDU 2579

HDU 2579 Dating with girls(2) (BFS)

题意:就是一个正常的迷宫,只不过这次石头会每个K步消失一次,即使当时间为K的倍数是,石头就会消失,其他时间又会存在。

思路:在标记时多标记一维,即使该次走后的步数模上K,当为0时石头的部分就可以走,其他情况就不可以走。

#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\n",u.x,u.y,u.p,u.step);
        //system("pause");
        if(u.x==ex&&u.y==ey){
            printf("%d\n",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!\n");
}
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;
}
Psong

 

posted on 2016-08-18 17:02  Psong  阅读(104)  评论(0编辑  收藏  举报

导航