Kolstad and Schrijvers
Farmer John went crazy and created a huge maze of fences out in a field. Happily, he left out two fence segments on the edges, and thus created two "exits" for the maze. Even more happily, the maze he created by this overfencing experience is a `perfect' maze: you can find a way out of the maze from any point inside it.
Given W (1 <= W <= 38), the width of the maze; H (1 <= H <= 100), the height of the maze; 2*H+1 lines with width 2*W+1 characters that represent the maze in a format like that shown later - then calculate the number of steps required to exit the maze from the `worst' point in the maze (the point that is `farther' from either exit even when walking optimally to the closest exit). Of course, cows walk only parallel or perpendicular to the x-y axes; they do not walk on a diagonal. Each move to a new square counts as a single unit of distance (including the move "out" of the maze.
Here's what one particular W=5, H=3 maze looks like:
+-+-+-+-+-+ | | +-+ +-+ + + | | | | + +-+-+ + + | | | +-+ +-+-+-+
Fenceposts appear only in odd numbered rows and and odd numbered columns (as in the example). The format should be obvious and self explanatory. Each maze has exactly two blank walls on the outside for exiting.
PROGRAM NAME: maze1
INPUT FORMAT
Line 1: | W and H, space separated |
Lines 2 through 2*H+2: | 2*W+1 characters that represent the maze |
SAMPLE INPUT (file maze1.in)
5 3 +-+-+-+-+-+ | | +-+ +-+ + + | | | | + +-+-+ + + | | | +-+ +-+-+-+
OUTPUT FORMAT
A single integer on a single output line. The integer specifies the minimal number of steps that guarantee a cow can exit the maze from any possible point inside the maze.
SAMPLE OUTPUT (file maze1.out)
9
The lower left-hand corner is *nine* steps from the closest exit.
题意:
给出 W(1 ~ 38),H(1 ~ 100),代表有 2 * W + 1 列,2 * H + 1 行的一个地图。根据这个地图,输出任意一点至少要逃出迷宫的步数,如样例输出9,就是最左下角的格子逃出去至少需要9步。
思路:
BFS。要求任意一点都必须逃离迷宫,而且需要最少的步数,那么挑选离出口最远的点BFS即可求出最少步数。因为不知道哪一点最远,故每一格都BFS一次,求出每个点的最小值,同时比较大小取最大值即可。
AC:
/* TASK:maze1 LANG:C++ ID:sum-g1 */ #include <cstdio> #include <iostream> #include <string.h> #include <algorithm> #include <queue> using namespace std; typedef struct { int x,y,step; }node; node no[50000]; char Map[205][100]; bool End[205][100],vis[205][100]; int dir[4][2] = {-2,0,0,-2,2,0,0,2}; int n,m,max_step; bool test(int way,int x,int y) { if(way == 0 && Map[x - 1][y] == ' ') return true; if(way == 1 && Map[x][y - 1] == ' ') return true; if(way == 2 && Map[x + 1][y] == ' ') return true; if(way == 3 && Map[x][y + 1] == ' ') return true; return false; } int bfs(int x,int y) { if(End[x][y]) return 1; node a; memset(vis,0,sizeof(vis)); queue<node> q; while(!q.empty()) q.pop(); a.x = x;a.y = y;a.step = 1; q.push(a); vis[a.x][a.y] = 1; while(!q.empty()) { node now = q.front();q.pop(); for(int i = 0;i < 4;i++) { node b; b.x = now.x + dir[i][0]; b.y = now.y + dir[i][1]; b.step = now.step + 1; if(b.x >= 1 && b.x <= 2 * n - 1 && b.y >= 1 && b.y <= 2 * m - 1 && !vis[b.x][b.y] && test(i,now.x,now.y)) { q.push(b); vis[b.x][b.y] = 1; if(End[b.x][b.y]) return b.step; } } } } void init() { for(int i = 0;i < 2 * n + 1;i++) for(int j = 0;j < 2 * m + 1;j++) End[i][j] = false; for(int i = 1;i <= 2 * n - 1;i += 2) { if(Map[i][0] == ' ') End[i][1] = true; if(Map[i][2 * m] == ' ') End[i][2 * m - 1] = true; } for(int j = 1;j <= 2 * m - 1;j += 2) { if(Map[0][j] == ' ') End[1][j] = true; if(Map[2 * n][j] == ' ') End[2 * n - 1][j] = true; } max_step = -1; } int main() { freopen("maze1.in","r",stdin); freopen("maze1.out","w",stdout); scanf("%d%d",&m,&n); getchar(); for(int i = 0;i < 2 * n + 1;i++) gets(Map[i]); init(); for(int i = 1;i <= 2 * n - 1;i += 2) for(int j = 1;j <= 2 * m - 1;j += 2) max_step = max(max_step,bfs(i,j)); printf("%d\n",max_step); return 0; }
相关推荐
在IT领域,尤其是在算法和计算机科学中,"魔方-BFS-输入_魔方bfs_魔方降群法+双向bfs_魔方降群_"这个标题涉及到的是使用广度优先搜索(Breadth First Search, BFS)解决魔方问题的高级技巧。魔方是一种三维旋转拼图...
标题中的"BFS.rar_bfs_bfs matlab_bfs matlab"提到了"BFS"以及与MATLAB相关的优化算法。BFS,全称为Breadth-First Search(广度优先搜索),通常用于图论或树结构的遍历。在MATLAB环境中,BFS可以被应用于解决各种...
代码 基于BFS广度优先搜索算法代码代码 基于BFS广度优先搜索算法代码代码 基于BFS广度优先搜索算法代码代码 基于BFS广度优先搜索算法代码代码 基于BFS广度优先搜索算法代码代码 基于BFS广度优先搜索算法代码代码 ...
该问题常用于演示搜索算法,如宽度优先搜索(BFS)、深度优先搜索(DFS)、双向宽度优先搜索(BBFS)以及A*搜索。 首先,**宽度优先搜索(BFS)**是一种按层进行搜索的算法,它会优先检查离起点近的解。在八数码...
**广度优先搜索(BFS)**是一种在图或树数据结构中进行遍历或搜索的算法,其基本思想是从根节点开始,按照层次顺序依次访问每个节点。它首先访问最近的节点,然后逐渐扩展到更远的节点。在有向图中,BFS依然按照层次...
在本话题中,我们将深入探讨BFSK的基本原理,以及如何利用MATLAB软件来模拟和计算BFSK系统的误码率曲线。 首先,让我们理解BFSK的工作原理。BFSK是FSK(频移键控)的一个变种,它使用两个不同的载波频率来代表二...
标题中的“bfsk_m.rar_BFSK_BFSK matlab_BFSK matlab_fsk_matlab BFSK”表明这是一个关于BFSK(Binary Frequency Shift Keying,二进制频率移键调制)的仿真项目,使用MATLAB语言进行实现。BFSK是一种数字调制技术,...
标题"simulink BFSK仿真"表明我们要探讨的是使用Simulink进行二进制频移键控(Binary Frequency Shift Keying, BFSK)的模拟与仿真。BFSK是一种数字调制技术,通过改变载波频率来传输二进制数据(0或1)。在Simulink...
根据给定文件中的标题“DFS \BFS生成树”、描述以及部分代码内容,我们可以提炼出以下几个关键知识点:邻接表、深度优先搜索(Depth-First Search, DFS)、广度优先搜索(Breadth-First Search, BFS)以及如何利用这...
**广度优先搜索(BFS)算法** 广度优先搜索(BFS)是一种在图或树数据结构中进行遍历的算法,它按照从根节点开始,先访问所有相邻节点,然后依次对每个已访问节点的相邻节点进行访问的原则进行搜索。在 BFS 中,...
标题“bfsk程序代码matlab”指的是使用MATLAB语言实现的BFSK(Binary Frequency Shift Keying,二进制频率移键控)编码技术的程序代码。BFSK是一种数字调制方法,通过改变载波频率来传输二进制数据,其中“0”和“1...
**标题:“BFS.rar_BFS JAVA_Bfs算法_bfs java_java b”** **描述:“java 数据结构 实现图的广度优先算法”** 在计算机科学中,数据结构和算法是编程的基础,它们决定了程序的效率和性能。在这个压缩包中,重点是...
“bfsk.rar_BFSK_BFSK 白噪声_BFSK 高斯_BFSK信号”这个标题提到了几个关键概念,首先,“BFSK”是二进制频率移键控(Binary Frequency Shift Keying)的缩写,这是一种常见的模拟调制技术,用于数字信号的无线传输...
**标题中的“bfs.rar_BFS+c++_bfs”表明这是一个关于C++实现BFS算法的压缩包文件,可能包含了一个名为“bfs”的源代码文件。** **描述中的“this is code for bfs in c++”进一步确认了这个压缩包内代码的主要功能...
【标题】"bfs.tar.gz_C#BFS_bfs" 提供的是一个使用C#实现的广度优先搜索(BFS)算法的代码压缩包。这个压缩包中的内容主要是关于如何在并行计算环境中,利用CUDA(Compute Unified Device Architecture)技术来优化...
**BFS算法详解** 在计算机科学中,图遍历是一种重要的算法,用于探索图的所有节点。其中,广度优先搜索(Breadth-First Search,简称BFS)是一种按照节点的层次顺序遍历图的方法。BFS算法尤其适用于寻找最短路径、...
宽度优先搜索(BFS,Breadth-First Search)是一种用于遍历或搜索树或图的算法,它从根节点开始,沿着树的宽度方向进行探索,直到找到目标节点或者遍历完整个树。在图中,BFS通常用于找出两个节点间的最短路径,或者...
“bfs-java.zip_BFS JAVA_bfs_depth first search_java bfs” 这个标题提到了几个关键概念,首先是 "BFS",它代表了“广度优先搜索”(Breadth-First Search),这是一个在图论和计算机科学中常用的算法,用于遍历或...
深度优先搜索(DFS,Depth-First Search)和广度优先搜索(BFS,Breadth-First Search)是图论和树形结构中常用的两种遍历算法,它们在计算机科学中有着广泛的应用,如解决迷宫问题、网络爬虫、社交网络分析、最短...
在本文中,我们将深入探讨如何使用宽度优先搜索(BFS)算法实现经典的“贪吃蛇”游戏。贪吃蛇是一款非常流行的电子游戏,玩家需要控制一个不断移动的蛇去吃食物,每次吃到食物,蛇的长度就会增加,游戏区域也会相应...