首页 > 代码库 > 猫抓老鼠

猫抓老鼠

题目描述

老鼠被猫抓去坐牢了,所在的这个监狱是一个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 }

 

猫抓老鼠