HDU_1242_Rescue

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1242

大意:迷宫搜索,‘#‘代表墙,‘.‘代表路,‘x‘代表守卫,每移动1格用1秒,杀死守卫用1秒,angel(‘a‘表示)的朋友(用‘r‘表示),要去救她,问最短时间为多少?

分析:迷宫搜索,dfs

总结:注意读题,之前做的时候以为只有一个朋友,其实有多个,所以用‘a‘去找‘r‘比较方便。注意输入,之前输入也有错误。

代码:

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std;
#define N 205
#define INF 0x7ffffff

int n,m,minx;
int ex,ey;
char map[N][N];
bool vis[N][N];
int dir[4][2]= {{-1,0},{0,1},{1,0},{0,-1}};

bool inside(int x,int y)
{
    if(x>=0&&x<m&&y>=0&&y<n)
        return 1;
    return 0;
}

void dfs(int x,int y,int time)
{
    if(map[x][y]==‘r‘)
    {
        if(time<minx)
            minx=time;
        return;
    }
    if(map[x][y]==‘#‘)
        return;
    if(time>minx)
        return;
    if(!inside(x,y))
        return;
    if(vis[x][y])
        return;
    vis[x][y]=1;
    for(int i=0; i<4; i++)
    {
        int mx=x+dir[i][0];
        int my=y+dir[i][1];
        if(map[mx][my]==‘x‘)
            dfs(mx,my,time+2);
        else
            dfs(mx,my,time+1);
    }
    vis[x][y]=0;
}

int main()
{
    int sx,sy;
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        memset(vis,0,sizeof(vis));
        minx=INF;
        for(int i=0;i<m;i++)
            scanf("%s",map[i]);
        for(int i=0; i<m; i++)
            for(int j=0; j<n; j++)
                if(map[i][j]==‘a‘)
                {
                    sx=i;
                    sy=j;
                }
        //for(int i=0; i<m; i++)
          //  printf("%s\n",map[i]);
        dfs(sx,sy,0);
        if(minx==INF)
            printf("Poor ANGEL has to stay in the prison all his life.\n");
        else
            printf("%d\n",minx);
    }
    return 0;
}
时间: 2024-10-18 10:07:34

HDU_1242_Rescue的相关文章