`

poj 3083dfs+bfs问题

 
阅读更多

题意:给你一个h * w的迷宫,其中有一句话需要注意一下“Exactly one 'S' and one 'E' will be present in the maze, and they will always be located along one of the maze edges and never in a corner.”即始点‘S’和终点‘E’一定都与迷宫的边界相邻,这对做题很关键。然后问你沿着迷宫墙壁的左边走和沿着迷宫墙壁的右边走,各需多少步,然后最少需要多少步。

 

思路:求最少步数没有什么好说当然是用bfs,重要的是求沿着迷宫墙壁走的两种状态。首先考虑,迷宫的起点是与墙壁挨着的,所以当S在迷宫最左边(sy == 0)如果沿着左边走,应该先考虑向上走的情况,如果向上走不通,在考虑像右走的情况,最后考虑向下走的情况;如果沿着右边走,应先考虑向下走的情况,再考虑向右走的情况,再考虑向上走的情况;其他的情况(sx == 0 || sy == w-1||sx == h - 1)时思路是一样的,自己推导吧~于是只要dfs枚举在每一个方向上可能有的各种情况就好了。又写了一遍这道题的代码 着道题我觉得重要的是方向的确立 与方向坐标的顺序 同时注意方向坐标 x,y分别表示的意思。 方向的确立的一种方法就是花一个正方形,若是右优先就是逆时针 ,把正方向的位子设为0 这个位置同时也是方向坐标(0,1)里面的位置,然后他的右边是1 既是上(1,0) 这样以此类推这种方向坐标位置的确立加方法无疑是这道题最精髓的东西。其实规定向左为顺时针或者逆时针是无所谓的,只要下次操作时与其一致就可以了,没必要那么纠结这个事情。 还要注意的事情就是当到底一个新的坐标的时候的时候,在这个新的坐标上也要考虑坐标移动的先后方向,按照以前设置好的方向进行考虑。
具体代码如下:
#include<iostream>
#include<queue>
using namespace std;
struct point
{
	int x,y;
	int step;
};
int flag[45][45];
char map[45][45];
int dir1[4][2]={{0,-1},{1,0},{0,1},{-1,0}};//zuo优先
int dir2[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//you优先
int d1,d2;
int start[2];
int end[2];
int w,h;
void init()
{
	memset(flag,0,sizeof(flag));
	cin>>w>>h; 
	for(int i=0;i<h;i++)
	{
		cin>>map[i];
		for(int j=0;j<w;j++)
		{
			if(map[i][j]=='#')
			{
				flag[i][j]=1;
			}
			if(map[i][j]=='S')
			{
				start[0]=i;
				start[1]=j;
			}
			if(map[i][j]=='E')
			{
				end[0]=i;
				end[1]=j;
			}
		}
	}
	if(start[0]==0)
	{
		d1=1;
		d2=1;
	}
	else if(start[0]==h-1)
	{
		d1=3;
		d2=3;
	}
	else if(start[1]==w-1)
	{
		d1=2;
		d2=0;
	}
	else
	{ 
		d1=0;
		d2=2;
	}
}
int dfs(int x,int y,int d,int dir[][2])
{
	int step ,temp, tempx,tempy;
	if(x==end[0]&&y==end[1])
		return 1;
	for(int i=0;i<4;i++)
	{
		temp=(d+i)%4;
		tempx=x+dir[temp][1];
		tempy=y+dir[temp][0];
		if(tempx>=0&&tempx<h&&tempy>=0&&tempy<w&&!flag[tempx][tempy])
			break;
	}
	step=dfs(tempx,tempy,(temp+3)%4,dir)+1;
	return step;
}


int bfs()
{
	memset(flag,0,sizeof(flag));
	queue<point> q;
	point p;
	p.x=start[0];
	p.y=start[1];
	p.step=1;
	flag[p.x][p.y]=1;
	q.push(p);
	while(!q.empty())
	{
		p=q.front();
		q.pop();
		if(p.x==end[0]&&p.y==end[1])
			return p.step;
		for(int i=0;i<4;i++)
		{
			point temp;
			temp.x=p.x+dir1[i][1];
			temp.y=p.y+dir1[i][0];
			if(temp.x>=0&&temp.x<h&&temp.y>=0&&temp.y<w&&map[temp.x][temp.y]!='#'&&!flag[temp.x][temp.y])
			{
				flag[temp.x][temp.y]=1;
				temp.step=p.step+1;
				q.push(temp);
			}
		}
	}
	return 0;
}




int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		init();
		cout<<dfs(start[0],start[1],d1,dir1)<<" ";
		cout<<dfs(start[0],start[1],d2,dir2)<<" ";
		cout<<bfs()<<endl;
	}
}

 

 
 

 

分享到:
评论

相关推荐

    POJ1753-Flip Game

    两个解决方案的代码文件“POJ1753-Flip Game(BFS+bit).cpp”和“POJ1753-Flip Game(DFS+enum).cpp”分别实现了BFS和DFS策略。阅读这些代码可以帮助理解如何将理论转换为实际的程序实现。 五、文档说明 “POJ1753-...

    acm poj300题分层训练

    poj2488、poj3083等是DFS的练习,poj3278、poj1426等是BFS的题目。 5. **动态规划**和**数学**:poj1837、poj1276是简单的动态规划问题,poj3267、poj1836等进一步强化了DP,poj3252、poj1850等则涉及组合数学,poj...

    POJ1011-Sticks

    它涉及了数据结构(如并查集)、搜索算法(如DFS或BFS)以及几何问题的处理,对于提升编程竞赛技巧非常有帮助。通过解决这个问题,程序员可以深入理解如何在实际问题中运用计算机科学的基本原理。

    POJ_3131.zip_POJ 八数码_poj

    八数码问题的解题核心在于搜索算法,常见的有深度优先搜索(DFS)、宽度优先搜索(BFS)以及A*搜索等。其中,BFS通常能保证找到最短的步数,但空间复杂度较高。对于大型问题,特别是立体版本,可能会消耗大量内存。...

    LeetCode判断字符串是否循环-Leetcode:刷!

    背包问题 动态规划 POJ 3267 POJ 1260 POJ 1015 POJ 3176 POJ 1080 POJ 1159 POJ 2533 POJ 1836 Leetcode 70 Leetcode 309 搜索 DFS POJ 2488 POJ 3083 POJ 3009 POJ 1321 BFS POJ 3278 POJ 1426 POJ 3126 POJ 3414 ...

    经典 的POJ 分类

    - POJ 2488、POJ 3083:利用DFS遍历图或树。 - POJ 3009、POJ 1321:基于DFS的问题求解。 #### 广度优先搜索 (BFS) - **题目示例**: - POJ 2251:BFS的应用场景。 #### 其他搜索算法 - **题目示例**: - POJ ...

    北大POJ初级-简单搜索

    在实际编程实践中,理解并熟练运用简单搜索算法是基础,随着能力的提升,还会接触到更高级的搜索算法,如深度优先搜索(DFS)、广度优先搜索(BFS),以及二叉搜索树等更复杂的搜索结构。在POJ平台上不断挑战和解决...

    poj各种分类

    包括深度优先遍历(DFS)和广度优先遍历(BFS),用于探索图的所有节点,是解决许多图问题的基础,如poj1860和poj3259所示。 #### 最短路径算法 Dijkstra算法、Bellman-Ford算法和Floyd算法分别适用于无负权边、有...

    poj1094 拓扑排序

    在实现拓扑排序时,一般采用**深度优先搜索(DFS)**或**广度优先搜索(BFS)**两种方法。DFS直接从入度为0的节点开始,而BFS则利用队列来按顺序处理这些节点。对于poj1094题目,我们需要读取输入文件,构建图的邻接...

    强大的poj分类

    常用的搜索算法有深度优先搜索(DFS)、广度优先搜索(BFS)、贪心算法、回溯算法等。 **重要性**:搜索算法是解决许多复杂问题的有效手段。例如,在游戏AI、路径规划等领域有着广泛的应用。 **示例题目**: - POJ...

    POJ2531-Network Saboteur

    2. **图的遍历**:DFS和BFS是解决图问题的常用方法,它们可以用来寻找特定路径或计算节点之间的最短路径。 3. **网络破坏策略**:题目可能要求玩家找出最小数量的节点,破坏这些节点将导致整个网络崩溃。这需要对图...

    北大POJ初级-图算法

    在POJ题目中,BFS常用于最短路径问题、最近公共祖先查询等。比如求解两节点间的最短路径,如果边的权重都为1,BFS将给出答案。 3. **Dijkstra算法**:这是解决单源最短路径问题的经典算法,适用于有向图或无向图,...

    POJ3126-Prime Path

    在这个问题中,可以使用DFS或BFS来探索从起点到其他节点的所有素数路径。 4. **动态规划(Dynamic Programming, DP)**:虽然这不是必需的,但一些复杂的问题可以通过DP来优化求解过程,比如预计算某些节点是否为...

    acm训练计划(poj的题)

    - (poj1328, poj2109, poj2586):介绍各种搜索算法,如深度优先搜索(DFS)、广度优先搜索(BFS)等。 3. **排序与查找**: - 提供对排序和查找算法的理解与应用指导,包括快速排序、归并排序、二分查找等经典...

    POJ2706-Connect

    “POJ2706-Connect”是一个关于图的连通性问题,通过DFS或BFS算法可以求解。解题者提供的代码已经通过了系统测试,而解题报告则进一步解析了代码的实现细节。学习这类问题有助于提升对图论的理解和编程技巧,对参加...

    PKU_poj 1001~1009

    可能涉及的经典算法有分治策略、贪心算法、回溯法、动态规划、图算法(如DFS、BFS、最短路径算法)等。每个子文件中的代码都是对特定问题的算法实现。 4. 数据结构:有效的数据结构是解决问题的关键。常见数据结构...

    poj题目分类

    1. 深度优先搜索(DFS):如POJ2488、POJ3083等,常用于解决图和树的问题。 2. 广度优先搜索(BFS):如POJ3278、POJ1426,适用于寻找最短路径等。 3. 搜索技巧与剪枝:优化搜索效率,如POJ2531、POJ1416。 五、...

    POJ中级图算法所有题目【解题报告+AC代码】

    4. **深度优先搜索(DFS)** 和 **广度优先搜索(BFS)**:这两种遍历方法是图算法的基础,常用于寻找路径、判断连通性、检测环路等。DFS通过递归或栈实现,而BFS使用队列进行。 5. **二分图匹配**:匈牙利算法或...

    POJ1039-Pipe

    POJ1039-Pipe可能需要应用到的算法包括但不限于深度优先搜索(DFS)、广度优先搜索(BFS)、动态规划、贪心算法或图的遍历算法。 4. **图论**:由于题目名为"Pipe",很可能涉及到图的结构,比如管道之间的连接可以...

Global site tag (gtag.js) - Google Analytics