[BFS] 逃离迷宫 长沙理工大学校赛G

28人阅读 评论(0) 收藏 举报
分类:

链接:https://www.nowcoder.com/acm/contest/96/G

题目描述

给你一个n*m的图,地图上'.'代表可以走的地方,而'#'代表陷阱不能走,
'P'代表人物位置,'K'代表钥匙,'E'代表出口。
人物一个,钥匙有多个,('K'的数量<=50)),出口一个,
每个位置可以向(上,下,左,右)四个方向走一格,花费一个单位时间,
现在你需要花费最少的时间拿到钥匙 然后从迷宫的出口出去
(若没有钥匙,则不能进入迷宫出口所在的格子)。

输入描述:

第一行一个整数T(T <= 50),代表数据的组数
接下来一行n,m(n<=500,m<=500),代表地图的行和列
接下来n行,每行一个长度为m的字符串,组成一个图。

输出描述:

如果可以出去,输出所花费的最少时间。
如果不能出去,输出一行"No solution"。

输入

3
5 5
....P
##..E
K#...
##...
.....
5 5
P....
.....
..E..
.....
....K
5 5
P#..E
.#.#.
.#.#.
.#.#.
...#K


输出

No solution
12
No solution

//多个k:经过K的最短路 = 起点开始到k + 终点开始到k 的最短路之和最小
#include <bits/stdc++.h>
using namespace std;
int n, m;
char M[500][500], m1[500][500], m2[500][500];
int D[500][500], d1[500][500], d2[500][500];
int dirx[4] = {0, -1, 0, 1};
int diry[4] = { -1, 0, 1, 0};
struct weizhi
{
	int x, y;
} s, e;
queue<weizhi>sq, eq;
int main()
{
	int T;
	cin >> T;
	while ( T-- )
	{
		cin >> n >> m;
		for ( int i = 0; i < n; i++ )
			for ( int j = 0; j < m; j++ )
			{
				cin >> M[i][j];
				m1[i][j] = M[i][j], m2[i][j] = M[i][j];
				d1[i][j] = 1e9, d2[i][j] = 1e9, D[i][j] = 1e9;
				if ( M[i][j] == 'P' ) s.x = i, s.y = j, sq.push ( s );
				if ( M[i][j] == 'E' ) e.x = i, e.y = j, eq.push ( e );
			}  //复制两张相同的地图
		void sbfs ( weizhi );
		sbfs ( s ); //从起点开始广搜
		void ebfs ( weizhi );
		ebfs ( e ); //从终点开始
		int ans = 1e9;
		for ( int i = 0; i < n; i++ )
			for ( int j = 0; j < m; j++ )
			{
				if ( M[i][j] == 'K' )
					D[i][j] = d1[i][j] + d2[i][j];
				//总距离=起点到k + 终点到k 
				ans = ( ans < D[i][j] ) ? ans : D[i][j];
			}
		if ( ans == 1e9 ) cout << "No solution" << endl;
		else cout << ans << endl;
	}
	return 0;
}
void sbfs ( weizhi s )
{
	d1[s.x][s.y] = 0;
	m1[s.x][s.y] = '#';
	while ( !sq.empty() )
	{
		weizhi now = sq.front();
		sq.pop();
		weizhi t;
		for ( int i = 0; i < 4; i++ )
		{
			t.x = now.x + dirx[i];
			t.y = now.y + diry[i];
			if ( t.x >= 0 && t.x < n && t.y >= 0 && t.y < m
			                && m1[t.x][t.y] != '#' && m1[t.x][t.y] != 'E' )
			{       //不能进入出口所在的格子
				m1[t.x][t.y] = '#';
				d1[t.x][t.y] = d1[now.x][now.y] + 1;
				sq.push ( t );
			}
		}
	}
}
void ebfs ( weizhi e )
{
	d2[e.x][e.y] = 0;
	m2[e.x][e.y] = '#';
	while ( !eq.empty() )
	{
		weizhi now = eq.front();
		eq.pop();
		weizhi t;
		for ( int i = 0; i < 4; i++ )
		{
			t.x = now.x + dirx[i];
			t.y = now.y + diry[i];
			if ( t.x >= 0 && t.x < n && t.y >= 0 && t.y < m
			                && m2[t.x][t.y] != '#' )
			{
				m2[t.x][t.y] = '#';
				d2[t.x][t.y] = d2[now.x][now.y] + 1;
				eq.push ( t );
			}
		}
	}
}

查看评论

机器学习-Q-Learning-沙鼠走迷宫

-
  • 1970年01月01日 08:00

2018年长沙理工大学第十三届程序设计竞赛 G 逃离迷宫 【BFS】

链接:https://www.nowcoder.com/acm/contest/96/G 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65...
  • Dup4plz
  • Dup4plz
  • 2018-04-14 19:46:16
  • 54

hdu 3345 War Chess(BFS 判断条件稍多,有陷阱)

1、http://acm.hdu.edu.cn/showproblem.php?pid=3345 2、题目大意: 给定一张图,其中'R'代表河,从此方格经过消费3个mv,'T'代表树,从此格经过消...
  • sdjzping
  • sdjzping
  • 2013-08-01 16:31:02
  • 1070

逃离迷宫

链接:https://www.nowcoder.com/acm/contest/96/G来源:牛客网题目描述给你一个n*m的图,地图上'.'代表可以走的地方,而'#'代表陷阱不能走, 'P'代表人物位...
  • doublekillyeye
  • doublekillyeye
  • 2018-04-17 15:25:25
  • 6

贪心算法求解 图的m着色问题

贪心算法求解 图的m着色问题 分类: C/C++ 数据结构/基础算法2013-03-29 19:45 1277人阅读 评论(2) 收藏 举报 图的m色判定问题: 给定无向连通图G和...
  • pi9nc
  • pi9nc
  • 2013-07-16 09:36:02
  • 20089

百度地图的一些疑问

package com.example.baidutest; import android.app.Activity; import android.os.Bundle; import androi...
  • csu54zzg
  • csu54zzg
  • 2014-10-20 20:11:51
  • 2012

Cocos2d-x 地图行走的实现1:图论与Dijkstra算法

本文乃Siliphen原创,转载请注明出处:http://blog.csdn.net/stevenkylelee 本文的实现基于Cocos2d-x 3.2   目录: 1.什么是地图行走 2.图...
  • StevenKyleLee
  • StevenKyleLee
  • 2014-08-07 00:23:53
  • 9326

ArcGIS Server 地图发布遇到的常见问题及解决办法

内网发布时,如果看不到地图,将服务器上的agsadmin和agsuser添加everyone 外网发布如果用户能访问发布的网页,确看不到地图,可能是arcgis服务的配置文件的虚拟路径不正确 ...
  • Mello_
  • Mello_
  • 2014-09-26 14:44:14
  • 13969

百度地图demo

包含了百度地图的定位,覆盖物,poi搜索,路线搜索,地理编码等功能 第一步,申请key,具体见百度地图官网:http://developer.baidu.com/map/index.php?tit...
  • u010335298
  • u010335298
  • 2015-01-30 11:30:56
  • 2559

codeForces 242C.King's Path(map+BFS)

E - King's Path  CodeForces - 242C  The black king is standing on a chess field consisting o...
  • ZscDst
  • ZscDst
  • 2017-04-13 16:05:05
  • 497
    个人资料
    持之以恒
    等级:
    访问量: 544
    积分: 453
    排名: 11万+
    文章存档