Rescue
原题面:
Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described as a N * M (N, M <= 200) matrix. There are WALLs, ROADs, and GUARDs in the prison.
Input
First line contains two integers stand for N and M.
Then N lines follows, every line has M characters. “.” stands for road, “a” stands for Angel, and “r” stands for each of Angel’s friend.
Process to the end of the file.
Output
For each test case, your program should output a single integer, standing for the minimal time needed. If such a number does no exist, you should output a line containing “Poor ANGEL has to stay in the prison all his life.”
翻译结果(有误,可结合原题面分析):
安吉尔被莫利比抓住了!他被莫利比关进了监狱。监狱被描述为一个N * M (N, M <= 200)矩阵。监狱里有墙、路和卫兵。
安吉尔的朋友们想要救安吉尔。他们的任务是:接近天使。我们假设“接近天使”就是到达天使停留的位置。当网格里有守卫时,我们必须杀死他(或她?)才能进入网格。我们假设上移,下移,右移,左移需要1个单位的时间,杀死一个守卫也需要1个单位的时间。我们有足够的力量杀死所有的守卫。
你必须计算出接近天使的最短时间。(当然,我们只能向上、向下、向左、向右移动,移动到边界内的邻居网格。)
输入
第一行包含两个代表N和M的整数。
然后是N行,每一行有M个字符。“a”代表天使,“r”代表每个天使的朋友。
处理到文件末尾。
输出
对于每个测试用例,您的程序应该输出一个整数,表示所需的最小时间。如果这个数字不存在,你应该输出一行“Poor ANGEL has to stay in the prison all his life”
样例输入:
7 8
#.#####.
#.a#..r.
#..#x...
..#..#.#
#...##..
.#......
........
样例输出:
13
解题思路: 由于天使(a)有多个朋友,因此“天使找朋友”更适合解决该问题。所以我们先找到天使所在的位置,应用DFS解决。
代码如下:
#include
#include
#include
using namespace std;
int n,m,sx,sy,minn=10000,xx,yy;
int flag=0;//用来标记是否找到天使的朋友(r)
int mov[4][2]= {1,0,0,1,-1,0,0,-1};
char mp[205][205];
int bj[205][205];
void bfs(int x,int y ,int step)
{
if(mp[x][y]=='r')
{
flag=1;
if(minn>step)
minn=step;
return ;
}
for(int i=0; i<4; i++)
{
int xx=x+mov[i][1];
int yy=y+mov[i][0];
if(xx<0||yy<0||xx>=n||yy>=m||mp[xx][yy]=='#'||bj[xx][yy])
continue;
bj[xx][yy]=1;
if(mp[xx][yy]=='x')
bfs(xx,yy,step+2);
else
bfs(xx,yy,step+1);
bj[xx][yy]=0;
}
}
int main ()
{
while(~scanf("%d %d",&n,&m))
{
flag=0;
minn=99999;
getchar();
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
scanf("%c",&mp[i][j]);
getchar();
}
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
if(mp[i][j]=='a')
{
sx=i;
sy=j;
break;
}
}
bj[sx][sy]=1;
bfs(sx,sy,0);
if(flag==0)
printf("Poor ANGEL has to stay in the prison all his life.\n");
else
printf("%d\n",minn);
}
return 0;
}