其他分享
首页 > 其他分享> > 逃跑 (计蒜客)

逃跑 (计蒜客)

作者:互联网

蒜头被困在了一个 n+1n+1 行 m+1m+1 列的迷宫当中,蒜头所在位置为左上角的 ( 0 , 0 )(0,0),他需要逃跑到位于右下角 ( n , m )(n,m) 的出口位置。在逃跑的过程中,蒜头只可以向东南西北四个方向移动,当然也可以选择停留在某一位置,他每移动一个单位距离需要 11 秒的时间,蒜头初始时刻的能量为 dd,蒜头在迷宫当中每过 11 秒需要消耗 11 单位能量。在迷宫中有 kk 个士兵,他们会朝着某一方向周期性地射击,子弹只会在整点位置射中蒜头。当蒜头被子弹射中、和士兵相遇或者能量消耗完时,他将死去。求蒜头逃离迷宫的最短时间。

输入格式

第一行包含四个整数 n,m,k,d ( 2 \leq n , m \leq 100 ; 0 \leq k \leq 100 ; m+n \leq d \leq 1000 )n,m,k,d(2≤n,m≤100;0≤k≤100;m+n≤d≤1000)。

接下来 kk 行每行包含一个字符 cc 和四个整数 t,v, x, y ( t , v \leq 100 ; 0 \leq x \leq n ; 0 \leq y \leq m )t,v,x,y(t,v≤100;0≤x≤n;0≤y≤m),其中 cc 表示每个士兵的射击方向,使用NSWE表示上下左右四个方向,射击的周期为 tt,子弹的速度为 vv,士兵所在位置为 ( x , y )(x,y)。

输出格式

输出一个整数,表示蒜头逃跑的最短时间,如果蒜头不能成功的逃离迷宫,输出Bad luck!

 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int n,m,k,d;
int t,v,x,y;
char maze[200][200],c;
int dir[5][2]={{0,0},{1,0},{-1,0},{0,1},{0,-1}};
int vis[1005][105][105];//时刻,位置 最大时刻为d
int ans=2000;
int in(int x,int y) {
    return x>=0&&x<=n&&y>=0&&y<=m;
}
void signvis() {
    while(k--) {
    getchar();
    scanf("%c",&c);getchar();
    scanf("%d%d%d%d",&t,&v,&x,&y);
  
    maze[x][y]='#';
    if(c=='N') {
        int col_num=x;
        int val_num=(col_num/v);
        if(val_num>0) {
            for(int i=0;i<=d;i+=t) {
                for(int j=1;j<=val_num;j++) {
                    int x1=x-j*v;
                    vis[i+j][x1][y]=1;
                }
            }
        }
    }
    else if(c=='S') {
        int col_num=n-x;
        int val_num=(col_num/v);
        if(val_num>0) {
            for(int i=0;i<=d;i+=t) {
                for(int j=1;j<=val_num;j++) {
                    int x1=x+j*v;
                    vis[i+j][x1][y]=1;
                }
            }
        }
    }
    else if(c=='W') { 
        int col_num=y;
        int val_num=(col_num/v);
        if(val_num>0) {
            for(int i=0;i<=d;i+=t) {
                for(int j=1;j<=val_num;j++) {
                    int y1=y-j*v;
                    vis[i+j][x][y1]=1;
                }
            }
        }
    }
    else {
        int col_num=m-y;
        int val_num=(col_num/v);
        if(val_num>0) {
            for(int i=0;i<=d;i+=t) {
                for(int j=1;j<=val_num;j++) {
                    int y1=y+j*v;
                    vis[i+j][x][y1]=1;
                }
            }
        }
    }
}
}
void dfs(int x,int y,int t) {
    if(t>d||t>ans) return; 
    if(x==n&&y==m) { 
        if(ans>t){ 
            ans=t;
        }
        return;
    }
    vis[t][x][y]=1;
    for(int i=0;i<5;i++){
        int tx=x+dir[i][0];
        int ty=y+dir[i][1]; 
        if(in(tx,ty)&&!vis[t+1][tx][ty]&&maze[tx][ty]!='#'){
            dfs(tx,ty,t+1);
        }
    }
    vis[t][x][y]==0;
}
int main() {
    scanf("%d%d%d%d",&n,&m,&k,&d);
    memset(vis,0,sizeof(vis));
    memset(maze,'.',sizeof(maze));
   
   if(k!=0) {
        signvis();
    }
    dfs(0,0,0);
    if(ans>d) printf("Bad luck!");
    else printf("%d",ans);

    return 0;
}

 

 

标签:蒜头,return,int,leq,ans,逃跑,计蒜客,100
来源: https://blog.csdn.net/wwenddy/article/details/118993985