1. 程式人生 > >Luogu P2298 Mzc和男家丁的遊戲

Luogu P2298 Mzc和男家丁的遊戲

次數 turn center false empty 直接 using while 輸入格式

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");
}

  

Luogu P2298 Mzc和男家丁的遊戲