A miss B(暴力+BFS)

99 篇文章 0 订阅
37 篇文章 0 订阅

题目描述  

有一天NoSoul跟他女朋友去一个游乐场玩,在一个迷宫里,悲了个催的,他们俩走丢了„„   现在给出迷宫的具体信息,请你判断一下他们俩能否在给定的时间内找到对方。

输入

输入包含多组测试用例。第一行是一个整数N,接下来有N组数据;

每组的第一行是3个整数X、Y、T(0<X、Y<10,T>=0);

接下来是一个X行,Y列的字符矩阵。矩阵中的字符含义如下:

 A:代表NoSoul初始时所在的位置 

B:代表NoSoul女朋友初始时所在的位置

 #:代表该位置是墙壁,无法通过 
*:代表该位置是陷阱,若不慎误入,将被困再也无法走出 数字

n:代表进入该位置,需要等待n个时间才能走出(0<=n<=9) 
NoSoul跟他女朋友每次均只能从其当前位置往上下左右相邻的不是墙壁的位置走去,且不能走出迷宫,每走一次需要花费1个时间。 
NoSoul跟他女朋友初始时所在的位置均不需要等待即可立即走出。 


输出 

对应每组测试数据,若他们俩能在T个时间内(包含T)找到对方,则输出他们能够找到对方的最短时间,否则输出字符串“A miss B”。每组输出占一行。 

样例输入 

3 4 4

 #10# 

A12B 

*#01

 3 4 2 

#10#

 A12B

 *#01 
样例输出 


<span style="font-size:18px;">#include <cstdio> 
#include <queue> 
#include <climits> using namespace std;   
int X, Y; 
int AX, AY, BX, BY; 
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, -1, 0, 1}; char map[10][10]; int mintime[10][10]; bool flag[10][10];   
struct Node {     int x, y;     int t; }; 
struct cmp { 
    bool operator()(const Node &a, const Node &b) {        
 return a.t > b.t;     
  } 
};   
int BFS(int x, int y) {     
int tx, ty, i, j;     
Node t1, t2; 
    priority_queue<Node, vector<Node>, cmp> PQ;    
 for(i=0; i<X; i++) {         
       for(j=0; j<Y; j++) { 
            mintime[i][j] = INT_MAX;             
            flag[i][j] = false;         
       }    
    } 
    mintime[x][y] = 0;    
   flag[x][y] = true; 
    t1.x = x;
    t1.y = y; 
    t1.t = 0;    
    PQ.push(t1); 
    while(!PQ.empty()) {        
     t2 = PQ.top();        
     PQ.pop(); 
        for(i=0; i<4; i++) { 
            tx = t2.x + dx[i];
            ty = t2.y + dy[i]; 
            if(tx>=0 && tx<X && ty>=0 && ty<Y && map[tx][ty]!='*' && map[tx][ty]!='#' && !flag[tx][ty]) { 
                mintime[tx][ty] = t2.t + 1;                 
                flag[tx][ty] = true; 
                if(!(map[tx][ty]=='A' || map[tx][ty]=='B'))                    
                t1.t = t2.t + map[tx][ty] - '0' + 1;                 
                else 
                    t1.t = t2.t + 1;                 
                t1.x = tx;
                t1.y = ty;                 
                PQ.push(t1);            
             }         
        }     
    } 
    return mintime[AX][AY] > mintime[BX][BY] ? mintime[AX][AY] : mintime[BX][BY]; 
}   
int main() { 
    int N, T, i, j;     
   scanf("%d", &N);     
   while(N--) { 
        int ans = INT_MAX; 
        scanf("%d %d %d\n", &X, &Y, &T); 
       for(i=0; i<X; i++) { 
            for(j=0; j<Y; j++) { 
                scanf("%c", &map[i][j]);                 
                if(map[i][j]=='A') {                     
                      AX = i; AY = j;                
                 } 
                if(map[i][j]=='B') {                     
                    BX = i; BY = j;                
                }            
         } 
         getchar();         
      } 
        for(i=0; i<X; i++) { 
            for(j=0; j<Y; j++) {                
                 if(map[i][j]!='#') {                     
                   int t = BFS(i, j);                     
                             if(t<ans)                           
                                    ans = t;                 
                }            
            }         
         } 
        if(ans<=T) 
            printf("%d\n", ans);         
        else 
            puts("A miss B");     } 
    return 0; 
} </span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值