2021秋季《数据结构》_EOJ 1087.地下迷宫探索

题目

在这里插入图片描述在这里插入图片描述

思路

  • 相较于一般dfs,还需要输出返回路径。利用函数调用栈的特性,在每次调用dfs的位置下方加入输出当前点的命令
  • 不存在路径的两点之间初始值赋为正无穷
  • 记得判断连通的题目要求

代码

#include<bits/stdc++.h>
using namespace std;
#define MAXN 1001

int path[MAXN][MAXN] = { {0} };
int book[MAXN] = { 0 };
int n, m, s;

void dfs(int u)  // u为当前顶点
{
	book[u] = 1;  // 走过了u
	cout << u << ' ';
	for (int i = 1; i <= n; i++)
	{
		if (path[u][i] && !book[i])
		// u,i之间有路且i没被走过
		{
			dfs(i);
			cout << u << ' ';
		}
	}
}


// dfs
int main()
{
	
	cin >> n >> m >> s;
	for (int i = 0; i < m; i++)
	{
		int x, y; cin >> x >> y;
		// 无向图
		path[x][y] = 1;
		path[y][x] = 1;
	}
	dfs(s);
	int flag = 1;
	for (int i = 1; i <= n; i++)
	{
		if (!book[i])  // 还有没被走过的顶点
		{
			flag = 0;
			break;
		}
	}
	if (!flag) cout << 0;
	cout << endl;
	return 0;
}

### 关于EOJ中的极坐标排序算法实现 对于极坐标排序,在处理几何问题时经常遇到。通常情况下,极坐标排序涉及到将一系列点按照它们相对于某个固定点的角度大小进行排序。 在具体实现上,可以采用如下方式: 1. **计算角度** 对于每一个点 \((x, y)\),先将其转换成相对原点或者指定中心点的向量表示形式。接着利用反正切函数 `atan2` 来获取该点与正X轴之间的夹角。此操作能够确保即使当 \(y\) 值为负数也能得到正确方向上的角度[^1]。 ```cpp double angle = atan2(y - center_y, x - center_x); ``` 2. **自定义比较器** 接下来创建一个用于标准库 sort 函数的比较器来依据上述计算出来的角度对所有点进行升序排列。如果两个不同位置拥有相同角度,则可以根据距离远近进一步区分先后顺序。 3. **特殊情况考虑** 当存在多个点位于同一直线上时(即具有相等的角度),应该额外加入逻辑判断这些共线点间的前后关系,比如可以通过检测横纵坐标的差值来进行微调。 4. **代码实例** 下面给出一段简单的C++代码片段作为示范,展示了如何基于极坐标系下的角度完成一组二维平面上散乱分布的数据点按顺时针或逆时针方向有序化的过程: ```cpp #include <bits/stdc++.h> using namespace std; struct Point { double x, y; }; bool cmp(const Point &a, const Point &b){ // 计算两点到原点(或其他选定参照物)连线所形成的角度 double angA = atan2(a.y, a.x), angB = atan2(b.y, b.x); // 如果角度相等则根据离起点的距离决定次序 if (fabs(angA - angB) < 1e-9) return hypot(a.x,a.y)<hypot(b.x,b.y); // 否则直接对比角度大小 return angA<angB; } int main(){ vector<Point> points={{...}};//初始化数据集 // 调用sort并传入自定义cmp规则 sort(points.begin(),points.end(),cmp); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值