猫抓老鼠

题目描述

老鼠被猫抓去坐牢了,所在的这个监狱是一个N * M (N, M <= 200)的矩形,监狱中由一些墙,路,警卫组成 。

老鼠的朋友想要救出它,而任务是接近老鼠。我们假设拯救老鼠的任务是到达老鼠所在的位置,上,下,左,右的移动都需要花费1个单位的时间,杀死守卫也需要花费1个单位的时间,而我们需要杀死通过的所有守卫。

现在,你需要以最小的时间去接近老鼠(我们只能够以上下左右的方式到达相邻的位置)

输入

第一行输入两个整数 N 和 M。

N为行数,M为列数,“.”代表路,“a”代表老鼠,“x”代表警卫,“r”代表老鼠朋友的起始位置。

输出

这道题中你只需要输出一个数字就可以了,如果不存在则输出“可怜的老鼠只能在监狱中度过他的余生了”。

样例输入

7 8 #.#####. #.a#..r. #..#x... ..#..#.# #...##.. .#...... ........

样例输出

13
 
 
考试题,迷宫,广度遍历
 1 #include<iostream>
 2 #include<queue>
 3 using namespace std;
 4 int N;
 5 int M;
 6 char a[205][205];
 7 typedef pair<int, int> s;
 8 int d[205][205];
 9 queue<s> q;
10 bool flag = 0;
11 int xr, yr, xa, ya;
12 int bx[4] = { 1,0,-1,0 };
13 int by[4] = { 0,1,0,-1 };
14 void bfs()
15 {
16     q.push(s(xr, yr));
17     int i, j;
18         for (i = 0; i<N; i++)
19             for (j = 0; j<M; j++)
20                 d[i][j] = 0;
21     while (q.size())
22     {
23         
24         s t = q.front();
25         q.pop();
26         for (i = 0; i<4; i++)
27         {
28             xr = t.first + bx[i]; yr = t.second + by[i];
29             if (xr>0 && xr<N&&yr>0 && yr<M&&a[xr][yr] != '#'&&d[xr][yr] == 0)
30             {
31                 q.push(s(xr, yr));
32                 if (a[xr][yr] == 'x')
33                     d[xr][yr] = d[t.first][t.second] + 2;
34                 else
35                     d[xr][yr] = d[t.first][t.second] + 1;
36             }
37             if (xr == xa&&yr == ya) { flag = 1; break; }
38         }
39         if (i != 4)break;
40         if (flag == 1)break;
41     }
42 }
43 int main()
44 {
45     cin >> N >> M;
46 
47     int i, j;
48     for (i = 0; i<N; i++)
49         for (j = 0; j<M; j++)
50             cin >> a[i][j];
51     for (i = 0; i<N; i++)
52         for (j = 0; j<M; j++)
53         {
54             if (a[i][j] == 'r') { xr = i; yr = j; }
55             if (a[i][j] == 'a') { xa = i; ya = j; }
56         }
57     bfs();
58     if (flag == 1)
59         cout << d[xa][ya] << endl;
60     else
61         cout << "可怜的老鼠只能在监狱中度过他的余生了" << endl;
62     return 0;
63 }

 

转载于:https://www.cnblogs.com/index556/p/6842968.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值