Luogu P2298 Mzc和男家丁的游戏
Mzc和男家丁的游戏
题目背景
mzc与djn的第二弹。
题目描述
mzc家很有钱(开玩笑),他家有n个男家丁(做过上一弹的都知道)。他把她们召集在了一起,他们决定玩捉迷藏。现在mzc要来寻找他的男家丁,大家一起来帮忙啊!
由于男家丁数目不多,再加上mzc大大的找人【laopo】水平很好,所以一次只需要找一个男家丁。
输入输出格式
输入格式:
第一行有两个数n,m,表示有n行m列供男家丁躲藏,
之后n行m列的矩阵,‘m‘表示mzc,‘d’表示男家丁,‘#’表示不能走,‘.‘表示空地。
输出格式:
一行,若有解:一个数sum,表示找到男家丁的最短移动次数。
若无解:输出“No Way!”。
输入输出样例
输入样例#1:
5 6 .#..#. ....#. d..... #####. m.....
输出样例#1:
12
说明
3=<M,n<=2000
由于mzc大大十分着急,所以他只能等待1S。
好水啊。我不想写了,大大们直接看代码吧。>_<
#include <iostream> #include <cstring> #include <cstdio> #include <queue> using namespace std; int n, m, sx, sy, ex, ey; char map[2003][2003]; bool vis[2003][2003], mark = false; struct node{int x, y, tot;}; queue<node> P; int dx[10] = {1, 0, -1, 0}; int dy[10] = {0, 1, 0, -1}; void bfs(node now) { while(!P.empty()) { now = P.front(); P.pop(); int x = now.x, y = now.y, tot = now.tot; if(x == ex&&y == ey) {printf("%d\n", tot); mark = true; return ;} for(int i=0; i<4; i++) { int xx = dx[i]+x, yy = dy[i]+y; if(xx <= n&&yy <= m&&xx > 0&&yy > 0&&map[xx][yy] != '#'&&!vis[xx][yy]) { vis[xx][yy] = 1; P.push((node) {xx, yy, tot+1}); } } } } int main() { scanf("%d%d", &n, &m); for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) {cin>>map[i][j]; if(map[i][j] == 'm')sx = i, sy = j; if(map[i][j] == 'd')ex = i, ey = j;} P.push((node) {sx, sy, 0}); vis[sx][sy] = 1; bfs(P.front()); if(mark == false) printf("No Way!\n"); }
作者:Mystical-W
来源:http://www.cnblogs.com/bljfy
说明:客官~~您如果觉得写得好的话,记得给我点赞哦。如果要转载的请在合适的地方注明出处。谢
谢您的合作。您要是有什么有疑问的地方可以在下面给我评论。也可以直接私信我哦
声明:本作品由Mystical-W采用知识共享署名-非商业性使用-禁止演绎 4.0 国
际许可协议进行许可
来源:http://www.cnblogs.com/bljfy
说明:客官~~您如果觉得写得好的话,记得给我点赞哦。如果要转载的请在合适的地方注明出处。谢
谢您的合作。您要是有什么有疑问的地方可以在下面给我评论。也可以直接私信我哦
声明:本作品由Mystical-W采用知识共享署名-非商业性使用-禁止演绎 4.0 国
际许可协议进行许可