`

poj 2935 (bfs+路径)

阅读更多

题目链接:http://poj.org/problem?id=2935

 

解题报告:刷到bfs明显的感觉有些难,这道题应该卡的有3~4天了吧!

首先说明一下bfs如何记录路径:在结构体中,用一个值来记录上一个的位置,然后再“回溯”(并不是真的回溯)到第一个元素,然后递归输出即可;

第二点:交换两个数的位运算方法:a^=b^=a^=b,看上去显得代码更有技术含量

第三点:注意输入值的顺序,我就在这卡了n久

 

#include<cstdio>
#include<cstring>
#include<queue>
#define swap(a,b) a^=b^=a^=b 
using namespace std;

const int maxn = 15;
const int dir[4][2]={0,2,2,0,0,-2,-2,0};
const char ch[4]={'E','S','W','N'};

struct node 
{
	int x,y;
	int pre;
	char c;
}q[maxn*maxn];

int sx,sy,ex,ey,num;
int mp[maxn][maxn];		

bool iswall( int x,int y,int i)
{
	if ( i==0 && mp[x][y-1] ) return true;
	else if(i==1&&mp[x-1][y]) return true;
	else if(i==2&&mp[x][y+1]) return true;
	else if(i==3&&mp[x+1][y]) return true;
	else return false;
}

void print(int x)
{
	if(x) 
	{
		print(q[x].pre );
		printf("%c",q[x].c);
	}
}

void bfs( )
{
	int front = 0, rear =  0;
	node frm = {sx,sy,0,0};
	q[rear++] = frm;
	while(front < rear)
	{
		frm = q[front];
		for( int i=0;i<4;i++)
		{
			node to = {frm.x+dir[i][0],frm.y+dir[i][1],front,ch[i]};
			if(to.x < 2||to.x >12||to.y <2||to.y > 12) continue;
			if(!mp[to.x][to.y]&&!iswall(to.x,to.y,i))
			{
				mp[to.x][to.y] = 1; 
				q[rear] = to;
				if(to.x==ex&&to.y==ey) 
				{
					print( rear );//printf("\nrear = %d front = %d",rear,front);
					return ;
				}
				++rear;
			}
		}
		++front;
	} 
}

int main()
{
	int a1,a2,b1,b2;
	while(scanf("%d%d",&sy,&sx)&&(sx||sy))
	{
		scanf("%d%d",&ey,&ex);
		memset(mp,0,sizeof(mp));
		ex = 2*ex;ey = 2*ey;
		sx = 2*sx;sy = 2*sy;
		mp[sx][sy] = 1;
		for(int i=0;i<3;i++)
		{
			scanf("%d%d%d%d",&b1,&a1,&b2,&a2);
			if( a1 == a2 )
			{
				if(b1>b2) swap(b1,b2);
				for(int j=b1;j<b2;j++)
					mp[a1*2+1][j*2+2]=1;
			}
			else 
			{
				if(a1>a2) swap(a1,a2);
				for(int j=a1;j<a2;j++)
					mp[2*j+2][b1*2+1]=1;
			}
		}	
		if( sx==ex && sy ==ey )
		{
			puts("");
			continue;
		}  
		bfs();
		printf("\n");
		
	}
	return 0;
}

 

0
1
分享到:
评论

相关推荐

    POJ1426-Find The Multiple【BFS+同余模】

    【标题】"POJ1426-Find The Multiple【BFS+同余模】"是一道来源于北京大学在线编程平台POJ的算法题目,主要涉及到了广度优先搜索(BFS)与同余模运算的知识点。这道题目要求解决的是寻找一个整数的倍数问题,可能...

    POJ3026-Borg Maze【BFS+Prim】

    《POJ3026-Borg Maze:BFS与Prim算法的应用解析》 在计算机科学领域,图论是解决问题的重要工具之一,而BFS(广度优先搜索)和Prim算法则是其中的两种经典算法。本篇文章将围绕北大POJ3026题目“Borg Maze”来探讨...

    NOI2002.rar_NOI 2002 dragon_poj bfs

    标题中的“NOI2002.rar_NOI 2002 dragon_poj bfs”提到了几个关键元素:NOI(全国青少年信息学奥林匹克),2002年赛事,dragon问题,以及poj_bfs。这表明我们即将讨论的是2002年全国青少年信息学奥林匹克竞赛中的...

    POJ1753-Flip Game

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

    POJ3436-ACM Computer Factory

    2. "POJ3436-ACM Computer Factory【BFS+压入重标法+模拟拆点】(不知道错哪里了).cpp":这里尝试结合BFS和压入重标法,并模拟拆点,但作者不确定代码中是否存在错误,可能需要进一步调试。 3. "POJ3436-ACM Computer...

    POJ_3131.zip_POJ 八数码_poj

    双向BFS是一种优化的搜索策略,它同时从初始状态和目标状态开始搜索,一旦两个搜索路径在中间某个节点相遇,就能找到最短路径。 八数码问题的解题核心在于搜索算法,常见的有深度优先搜索(DFS)、宽度优先搜索...

    poj各种分类

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

    POJ3126-Prime Path

    【标签】"POJ 3126 Prime Path" 指明了问题的关键元素:POJ是一个在线编程平台,3126是这道题目的编号,Prime Path则揭示了问题的核心,即寻找素数路径。 【详细说明】在解决"Prime Path"这个问题时,我们需要掌握...

    北大POJ初级-图算法

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

    POJ1459-Power Network

    - "POJ1459-Power Network【BFS+压入重标法】.cpp":这是解题的C++源代码文件,采用了BFS和压入重标法进行编程实现。代码中可能包括了图的表示(如邻接矩阵或邻接表),BFS的遍历过程,以及如何利用压入重标法进行...

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

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

    POJ2531-Network Saboteur

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

    强大的poj分类

    - POJ 2292 - Wormholes(图论中的最短路径问题) - POJ 2349 - Cows(贪心算法) **相关知识点**: - DFS和BFS的实现原理 - 贪心算法的选择原则 - 回溯算法在组合优化问题中的应用 - A*算法及其改进策略 ##### 4....

    acm训练计划(poj的题)

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

    POJ1011-Sticks

    优化策略可能包括快速判断线段相交的方法,如Sweep Line算法或Segment Tree,以及并查集的路径压缩和按秩合并优化。 总结来说,"POJ1011 - Sticks"是一个锻炼程序员几何理解、图论应用和算法实现能力的好题目。它...

    acm poj300题分层训练

    如poj3278、poj2049、poj3083是图遍历的例子,poj1860、poj3259等则是最短路径问题,poj1789、poj2485等则涉及最小生成树。 3. **数据结构**:包括串、排序、简单并查集、哈希表、二分查找、哈夫曼树和堆。poj1035、...

    POJ 分类题目 txt文件

    例如,题目poj1860和poj3259就是典型的最短路径问题。 ### 3. 数据结构 数据结构部分包括数组、链表、栈、队列、树、堆、哈希表等,它们在存储和访问数据时提供不同的效率和特性。哈希表(Hash)是一种高效的数据...

    POJ1039-Pipe

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

    POJ 3083 Children of the Candy Corn解题报告

    ### POJ 3083 Children of the Candy Corn 解题报告 #### Description 题目描述了一个典型的迷宫问题:在一个玉米地迷宫中,游客需要找到从入口到出口的路径。题目给出了一个常见的策略:选择左墙或右墙并沿着它...

    POJ 部分题解 解题报告

    5. **PKU 1010 搜索.txt**:搜索问题通常包括深度优先搜索(DFS)、广度优先搜索(BFS)或A*搜索算法。可能需要解决路径查找、迷宫求解等问题。 6. **POJ 3468 线段树--long long VS int.txt**:线段树是处理区间...

Global site tag (gtag.js) - Google Analytics