老鼠被猫抓去坐牢了,所在的这个监狱是一个N * M (N, M <= 200)的矩形,监狱中由一些墙,路,警卫组成 。
老鼠的朋友想要救出它,而任务是接近老鼠。我们假设拯救老鼠的任务是到达老鼠所在的位置,上,下,左,右的移动都需要花费1个单位的时间,杀死守卫也需要花费1个单位的时间,而我们需要杀死通过的所有守卫。
现在,你需要以最小的时间去接近老鼠(我们只能够以上下左右的方式到达相邻的位置)
标签:迷宫 std iostream while using pop ios amp stream
老鼠被猫抓去坐牢了,所在的这个监狱是一个N * M (N, M <= 200)的矩形,监狱中由一些墙,路,警卫组成 。
老鼠的朋友想要救出它,而任务是接近老鼠。我们假设拯救老鼠的任务是到达老鼠所在的位置,上,下,左,右的移动都需要花费1个单位的时间,杀死守卫也需要花费1个单位的时间,而我们需要杀死通过的所有守卫。
现在,你需要以最小的时间去接近老鼠(我们只能够以上下左右的方式到达相邻的位置)
第一行输入两个整数 N 和 M。
N为行数,M为列数,“.”代表路,“a”代表老鼠,“x”代表警卫,“r”代表老鼠朋友的起始位置。
这道题中你只需要输出一个数字就可以了,如果不存在则输出“可怜的老鼠只能在监狱中度过他的余生了”。
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 }
标签:迷宫 std iostream while using pop ios amp stream
原文地址:http://www.cnblogs.com/index556/p/6842968.html