hdu2822(会双搜后再写次)

本文介绍了使用双搜索策略优化宽度优先搜索(BFS)的方法,通过同时从起点和终点进行搜索,有效地减少了搜索时间和资源消耗。文章以一个具体示例说明了双搜索的优势,并提供了实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
分析:
    跑的太慢了,虽然1a了。
    等会了双搜后再写一次。


                           2012-07-19
*/

    一直都很好奇,为什么这篇文章点击量这么高?明明只是运气好,用一个bfs水过了的。。

下面是随便写的一点儿对双搜的很基础的解释、属牛的请主动忽略囧~~。双搜的话,对于这

个题、可以写两个bfs同时进行么,一个从s(源点)开始、另一个从e(终点)开始,两个

bfs域的第一次交汇的时候,就得到了一个最佳ans。

    举个例子:a、b两点间距为d1,如果以a为圆心、开始让一个圆变大(这里就说成圆吧,

因为一般的、n*n的矩阵中、每一步的距离为1的bfs(既边为1的最短路)中,bfs是以曼哈

顿距离扩展的,这里说成圆只是为了更容易理解)、直到圆的边蹭到了b点结束,这个圆的

面积为PI*d1*d1;

    但是,如果同时以a点、b点为中心,以同样的速度同时扩展俩圆,那么当两个圆蹭着的

时候,两个圆的面积总和为2*PI*(d1/2)*(d1/2);

    如果只是这样看的话,那么后一个式子是前一个的大小的一半,所以就省了时间。。。

    随手写的简单解释,写的不好了随意砸砖囧。。。










#include"stdio.h"
#include"string.h"
#include"queue"
using namespace std;

struct node
{
	int x,y;
	int step;
	friend bool operator<(node n1,node n2)
	{
		return n2.step<n1.step;
	}
};
int map[1011][1011];
int dir[4][2]={0,1, 0,-1, 1,0, -1,0};
int row,lie;
int x_s,y_s;
int x_e,y_e;

int judge(int x,int y)
{
	if(x<0 || x>=row || y<0 || y>=lie)	return 1;
	if(map[x][y]==1)	return 1;
	return 0;
}
int BFS()
{
	priority_queue<node>q;
	node cur,next;
	int i;

	cur.x=x_s;
	cur.y=y_s;
	cur.step=0;
	map[cur.x][cur.y]=1;

	q.push(cur);
	while(!q.empty())
	{
		cur=q.top();
		q.pop();
		if(cur.x==x_e && cur.y==y_e)	return cur.step;
		for(i=0;i<4;i++)
		{
			next.x=cur.x+dir[i][0];
			next.y=cur.y+dir[i][1];


			if(judge(next.x,next.y))	continue;
			if(map[next.x][next.y]==0)	next.step=cur.step;
			else						next.step=cur.step+1;
			map[next.x][next.y]=1;
			q.push(next);
		}
	}
	return -1;
}

int main()
{
	int i,l;
	int ans;
	char str[1011];
	while(scanf("%d%d",&row,&lie),row||lie)
	{
		if(row==0 && lie==0)	break;
		if(row==0 || lie==0)	{printf("0\n");continue;}

		for(i=0;i<row;i++)
		{
			scanf("%s",str);
			for(l=0;str[l];l++)
			{
				if(str[l]=='X')	map[i][l]=0;
				else			map[i][l]=-1;
			}
		}

		scanf("%d%d",&x_s,&y_s);
		x_s--;
		y_s--;
		scanf("%d%d",&x_e,&y_e);
		x_e--;
		y_e--;

		ans=BFS();
		printf("%d\n",ans);
	}
	return 0;
}


<think>好的,我现在需要帮助用户找到关于C语言实现红黑树的在线评测(OJ)题目。首先,我得理解用户的需求。用户可能是在准备考试或者面试,需要练习红黑树的C语言实现,并且希望通过在线评测系统来测试自己的代码。 接下来,我需要回忆一下常见的OJ平台,比如LeetCode、洛谷、HDU等,看看它们是否有相关的题目。但根据我的知识库,LeetCode等主流OJ可能较少直接考察红黑树的实现,因为红黑树属于高级数据结构,通常在实际工程中应用较多,但OJ题目可能更偏向于使用平衡树解决的问题,比如Treap或AVL树,或者直接使用标准库中的结构。 不过,用户明确提到C语言和红黑树,所以可能需要寻找更偏向底层实现的题目。例如,可能需要实现红黑树的插入、删除操作,或者解决与红黑树性质相关的题目。此外,有些大学的OJ可能会有这样的题目,特别是非OJ测评的院校,可能会在考试中涉及链表或树结构的实现,但需要具体例子。 然后,我查看提供的引用内容。引用[1]提到链表类问题对于OJ测评的同学可以用数组实现,但非OJ测评的院校可能会考链表。引用[4]提到平衡树问题,包括treap和树状数组的解法,可能涉及红黑树的相关应用。这可能提示用户,虽然直接的红黑树题目不多,但平衡树相关问题可能可以间接练习,或者某些题目需要红黑树作为解决方案的一部分。 考虑到用户需要C语言的实现,可能需要查找那些要求手动实现红黑树的题目。例如,有些OJ题目可能要求维护一个有序集合,支持高效的插入、删除和查询操作,这时候红黑树是一个合适的底层结构。但这类题目通常不会强制要求使用红黑树,只要效率达标即可,所以用户可能需要寻找明确要求红黑树的题目。 另外,可能需要建议用户参考一些经典的算法书籍或大学课程中的实验题目,这些地方更可能有红黑树的实现任务。例如,MIT的课程项目或《算法导论》中的实现题,虽然不一定是OJ形式,但用户可以通过自己编测试用例来验证。 最后,整理思路:直接的红黑树OJ题目较少,但可以通过平衡树相关问题进行练习,或者查找特定平台的题目。同时,建议用户查阅大学OJ或教材实验,以及提供红黑树的基本实现要点和注意事项,帮助用户自行练习。</think>### 关于C语言实现红黑树的OJ题目推荐 直接要求实现红黑树的OJ题目较少,但以下方向可能符合你的需求: 1. **平衡树相关问题** 红黑树属于平衡树的一种,可通过解决其他平衡树(如AVL树、Treap)的问题练习相似逻辑[^4]。例如: - **HDU 1908**:实现平衡树操作(插入、删除、查询),可用红黑树完成。 - **POJ 3481**:队列维护问题,需要高效动态排序能力。 2. **大学实验题或课程OJ** 部分高校的非公开OJ可能包含红黑树实现题,例如: - **实现集合操作**:要求支持插入、删除、查找,并统计中位数/极值。 - **动态排名问题**:维护数据流中的实时排名,需结合红黑树的有序性。 3. **手动实现红黑树的要点**(若无现成OJ题) 可参考以下流程自测: ```c // 红黑树节点定义 typedef struct Node { int key; int color; // 0:黑, 1:红 struct Node *left, *right, *parent; } Node; // 插入修复函数 void fix_insertion(Node **root, Node *z) { // 实现颜色调整与旋转逻辑 } ``` - 测试案例:依插入{10, 20, 30, 15, 25},验证红黑树性质(如根节点为黑色、无连续红节点等)。 4. **替代方案建议** 多数OJ允许用更简单的结构(如`STL map`或数组)替代红黑树[^1],例如: - **LeetCode 220**:桶排序+滑动窗口可高效解决,无需手动红黑树。 ### 建议练习路径 1. 先掌握红黑树的插入、删除规则和旋转操作。 2. 尝试实现完整红黑树并通过本地测试用例(如随机插入/删除后验证性质)。 3. 索关键词**C语言 红黑树 动态集合** 寻找定制化题目。 ### 注意事项 - 红黑树代码量较大,建议先理解透原理再动手[^4]。 - 调试时重点关注**黑修正**和**颜色翻转**的边界条件。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值