1012 Rescue

Rescue

Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 117 Accepted Submission(s) : 35
Problem Description
Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described as a N * M (N, M &lt;= 200) matrix. There are WALLs, ROADs, and GUARDs in the prison.<br><br>Angel's friends want to save Angel. Their task is: approach Angel. We assume that &quot;approach Angel&quot; is to get to the position where Angel stays. When there's a guard in the grid, we must kill him (or her?) to move into the grid. We assume that we moving up, down, right, left takes us 1 unit time, and killing a guard takes 1 unit time, too. And we are strong enough to kill all the guards.<br><br>You have to calculate the minimal time to approach Angel. (We can move only UP, DOWN, LEFT and RIGHT, to the neighbor grid within bound, of course.)<br>

Input
First line contains two integers stand for N and M.<br><br>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. <br><br>Process to the end of the file.<br>

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." <br>

Sample Input
  
  
7 8<br>#.#####.<br>#.a#..r.<br>#..#x...<br>..#..#.#<br>#...##..<br>.#......<br>........<br>

Sample Output
  
  
13<br>
看到第一眼应该是个广搜题,但我还是用深搜做的,并没有什么技术含量
代码:
#include<stdio.h> #include<string.h> int n,m,ok,ans,vis[205][205]; char mat[205][205]; void dfs(int x,int y,int step) {     if(vis[x][y] || mat[x][y]=='#' || step>=ans) return;     if(mat[x][y]=='r')     {         ok=1;         if(step<ans) ans=step;         return;     }     if(mat[x][y]=='x')         step++;     vis[x][y]=1;     dfs(x+1,y,step+1);     dfs(x-1,y,step+1);     dfs(x,y+1,step+1);     dfs(x,y-1,step+1);     vis[x][y]=0; } int main() {     while(~scanf("%d %d%*c",&n,&m))     {         memset(mat,'#',sizeof(mat));         int i,j,sti,stj;         for(i=1; i<=n; i++)         {             for(j=1; j<=m; j++)             {                 scanf("%c",&mat[i][j]);                 if(mat[i][j]=='a')                 {                     sti=i;                     stj=j;                 }             }             getchar();         }         ok=0;         ans=100000;         dfs(sti,stj,0);         if(ok) printf("%d\n",ans);         else printf("Poor ANGEL has to stay in the prison all his life.\n");     }     return 0;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值