杭电ACM1072——Nightmare~~广度优先搜索

题目的意思是:给你一个迷宫,0代表墙,1代表路,2代表起始位置,3代表终点,4代表爆破装置。一开始,你在2的位置,求到3的最少步数。

起初,你只有6秒钟的时间,时间减到0,你没到3的位置,代表不能出去,输出-1.想要增加时间,可以引爆爆破装置,引爆之后,时间重置为6,可以引爆多个。到引爆装置的时候,时间必须大于0,不然没有时间可以引爆。

迷宫最大是8 * 8。用广度优先搜索可以简单的解决问题。

下面的是AC的代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;

class Data
{
public:
	int Etime;
	int x, y;
	int count;
};

int n, m, sx, sy;
int map[9][9];
int direction[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};

int bfs()                       //广度搜索
{
	int i;
	int tx, ty;
	queue<Data> Que;
	while(!Que.empty())
	{
		Que.pop();
	}
	Data Da, temp;
	Da.x = sx; Da.y = sy;
	Da.Etime = 6; Da.count = 0;
	Que.push(Da);                       //起点入队
	while(!Que.empty())
	{
		temp = Que.front();
		Que.pop();
		if(map[temp.x][temp.y] == 3)  //到了终点
			return temp.count;
		if(temp.Etime == 1)           //没到终点,时间变成1,下一步之后,时间变0,无论怎么走,都没时间了,直接跳过
			continue;             //忽略掉时间为0的,下面的引爆就不用判断时间
		for(i = 0; i < 4; i++)        //四个方向搜索
		{
			tx = temp.x + direction[i][0];
			ty = temp.y + direction[i][1];
			if(tx < 0 || tx >= n || ty < 0 || ty >= m || map[tx][ty] == 0)
				continue;

			Da.x = tx; Da.y = ty; Da.Etime = temp.Etime - 1; Da.count = temp.count + 1;
			if(map[tx][ty] == 4)          //引爆,重置时间
			{
				Da.Etime = 6;
				map[tx][ty] = 0;
			}
			Que.push(Da);
		}
	}
	return -1;
}

int main()
{
//	freopen("data.txt", "r", stdin);
	int T, i, j;
	while(scanf("%d", &T) != EOF)
	{
		while(T--)
		{
			scanf("%d%d", &n, &m);
			for(i = 0; i < n; i++)
				for(j = 0; j < m; j++)
				{
					scanf("%d", &map[i][j]);
					if(map[i][j] == 2)            //找到起点
					{
						sx = i;
						sy = j;
					}
				}
			int ans = bfs();
			cout << ans << endl;
		}
	}
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-09 01:40:24

杭电ACM1072——Nightmare~~广度优先搜索的相关文章

杭电ACM分类

杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDIATE DECODABILITY

【转】对于杭电OJ题目的分类

[好像博客园不能直接转载,所以我复制过来了..] 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDI

杭电 2553 N皇后问题

http://acm.hdu.edu.cn/showproblem.php?pid=2553 N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 8077    Accepted Submission(s): 3603 Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不

杭电ACM题目分类

杭电ACM题目分类 基础题:1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028. 1029.1032.1037.1040.1048.1056.1058.1061.1070.1076.1089.1090.1091.1092. 1093.1094.1095.1096.1097.1098.1106.1108.1157.1163.1164.1170.1194.1196. 1197.1201.1202.1205.1219.1234.123

杭电1078(记忆搜索)

一道记忆搜索题,记忆搜索题就是搜索的形式+DP的思想! 题目: FatMouse has stored some cheese in a city. The city can be considered as a square grid of dimension n: each grid location is labelled (p,q) where 0 <= p < n and 0 <= q < n. At each grid location Fatmouse has hid

杭电 HDU ACM 1046 Tempter of the Bone

Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 83458    Accepted Submission(s): 22740 Problem Description The doggie found a bone in an ancient maze, which fascinated him a

杭电 1312 red and black

Red and Black Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8911    Accepted Submission(s): 5535 Problem Description There is a rectangular room, covered with square tiles. Each tile is color

杭电 1284

钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5446    Accepted Submission(s): 3106 Problem Description 在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法.请你编程序计算出共有多少种兑法. Input 每行只有一个正整数N,N小于32768. Outp

杭电dp题集,附链接

Robberies 点击打开链接 背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多少钱  最脑残的是把总的概率以为是抢N家银行的概率之和- 把状态转移方程写成了f[j]=max{f[j],f[j-q[i].v]+q[i].money}(f[j]表示在概率j之下能抢的大洋); 正确的方程是:f[j]=max(f[j],f[j-q[i].money]*q[i].v)  其中,f[j]表示抢j块大洋的最大的逃脱概率,条件是f[j-q[i].money]可达,也就是