迷宫bfs转弯

标签: c c++ 搜索 bfs 转弯
2人阅读 评论(0) 收藏 举报
分类:
链接:https://www.nowcoder.com/acm/contest/96/G
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

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

输入描述:

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

输出描述:

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


这道题是典型的bfs转弯问题,出口和钥匙的位置是任意的,所以每个点要标记上两种状态
即 拿过钥匙时走过 和没拿钥匙时走过  
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn = 505;

struct node{
	int x;
	int y;
	int step;
	int getKey;  // 1表示拿到钥匙  0表示没有钥匙 
//	node(int x,int y,int step,int getKey)
//	{
//		this->x = x;
//		this->y = y;
//		this->step = step;
//		this->getKey = getKey;
//	}
};
int t, n, m;
int pX, pY, eX, eY;
char mp[maxn][maxn];
int visit[maxn][maxn][2];
int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
int bfs()
{
	queue<node> q;
	node fir, tmp;
	fir.x = pX;
	fir.y = pY;
	fir.step = 0;
	fir.getKey = 0;
	q.push(fir);
	while(!q.empty())
	{
		tmp = q.front();
		q.pop();
		if(tmp.x == eX && tmp.y == eY) return tmp.step;
		
		for(int i = 0;i < 4;i ++)
		{
			fir = tmp;
			fir.x += dir[i][0];
			fir.y += dir[i][1];
			fir.step ++;
			if(fir.x >= 1 && fir.y >= 1 && fir.x <= n && fir.y <= m && mp[fir.x][fir.y] != '#')
			{
				if(mp[fir.x][fir.y] == 'E' && fir.getKey == 0) continue;
				if(mp[fir.x][fir.y] == 'K') fir.getKey = 1;
				if(!visit[fir.x][fir.y][fir.getKey])
				{
					q.push(fir);
					visit[fir.x][fir.y][fir.getKey] = 1;
				}
			}
		}
	}
	return -1;
}

int main()
{    
	cin >> t;
	while(t --)
	{
		memset(visit,0,sizeof(visit));
		cin >> n >> m;
		for(int i = 1;i <= n;i ++)
		{
			for(int j = 1;j <= m;j ++)
			{
				cin >> mp[i][j];
				if(mp[i][j] == 'P')
				{
					pX = i;
					pY = j;
				}
				if(mp[i][j] == 'E')
				{
					eX = i;
					eY = j;
				}
			}
		}
		
		int res = bfs();
		if(res != -1)
		cout << res << endl;
		else
		cout << "No solution" << endl;
		
	}
	return 0; 
}


查看评论

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

通过有趣的沙鼠走迷宫游戏,让大家掌握Q-Learning算法,并且能动手写一个让机器思考的程序
  • 2017年09月17日 15:49

hdoj 1728 逃离迷宫 【BFS 记录转弯次数】

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub...
  • chenzhenyu123456
  • chenzhenyu123456
  • 2015-08-05 20:15:58
  • 752

hdu1728 逃离迷宫(bfs限制拐弯次数)

http://acm.hdu.edu.cn/showproblem.php?pid=1728 题意:给你一张图,*代表墙,.代表路,给你起点终点坐标和限制的拐弯次数,求起点是否可以在拐弯次数内到达终...
  • Flynn_curry
  • Flynn_curry
  • 2016-10-23 13:13:30
  • 502

bfs转弯问题

hdu1175 题目链接;http://acm.hdu.edu.cn/showproblem.php?pid=1175; 题目大意;就是转弯只能转两次;只能走0的地方;首末位置的数字要相同;这题还...
  • zw1996
  • zw1996
  • 2016-08-16 20:04:49
  • 468

经典迷宫问题 BFS 广度优先

给定一个迷宫,入口为左上角,出口为右下角,问是否有路径从入口到出口,若有则输出一条这样的路径。注意移动可以从上、下、左、右、上左、上右、下左、下右八个方向进行。迷宫输入0表示可走,输入1表示墙。易得可...
  • qq_26891045
  • qq_26891045
  • 2016-03-12 11:17:37
  • 1584

走迷宫--图的搜索(bfs)并记录路径

题目描述: 一个网格迷宫由n行m列的单元格组成,每个单元格要么是空地(用1表示),要么是障碍物(用0来表示)。你的任务是找一条从起点到终点的最短步数和移动序列,其中UDLR表示上下左右操作。任何时候...
  • ly59782
  • ly59782
  • 2016-03-30 20:47:19
  • 3524

迷宫的最短路径-BFS算法

系白书上的一道队列题,初来乍到谈一下我对这个最短路SPFA的算法的理解  首先队列是先进先出,即push元素增加队列尾部,pop移除队列头部的元素  这个算法注意要标记之前走过的位置,然后开一个二维数...
  • zhlbjtu2016
  • zhlbjtu2016
  • 2017-07-02 10:57:22
  • 677

迷宫最短路径长度bfs

#include #include using namespace std; struct note { int x;//横坐标 int y;//纵坐标 int f;//父亲在队列中的编号,用于...
  • acm_JL
  • acm_JL
  • 2016-03-11 10:53:00
  • 2044

BFS经典例题—迷宫问题

Description 定义一个二维数组:  int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, ...
  • llzhh
  • llzhh
  • 2016-04-05 19:21:53
  • 3759

迷宫---DFS和BFS解法

题目描述 Description 在N*N的迷宫内,“#”为墙,“.”为路,“s”为起点,“e”为终点,一共4个方向可以走。从左上角((0,0)“s”)位置处走到右下角((n-1,n-1)“e”...
  • u013174702
  • u013174702
  • 2015-03-14 21:31:41
  • 1653
    个人资料
    持之以恒
    等级:
    访问量: 2万+
    积分: 2703
    排名: 1万+
    文章存档
    最新评论