基于Graham Scan实现多边形划分的C#输出格式问题求助
使用Graham Scan输出带原始索引的多边形点集
嘿,我懂你现在的处境——Graham Scan的核心逻辑已经跑通了,现在就差把生成的点集带上原始索引输出,还要符合指定的格式对吧?这事儿不难,我给你捋清楚怎么做:
一、先明确输入输出的细节
输入规则(你已经清楚,但再确认下)
- 第一行是整数
n,点的总数 - 接下来
n行每行两个整数x y,对应一个点的坐标(无重复) - 举个示例输入:
3 0 0 0 1 1 0
输出要求
- 首行必须以
s开头(比如s = [索引列表]或者s = 点集长度,看问题具体要求,大概率是输出带索引的集合) - 后续要按Graham Scan生成的顺序,输出每个点的原始索引+坐标
二、核心修改点:给点绑定原始索引
你之前的Graham Scan应该只处理了坐标,现在只需要把每个点的索引存进去就行,不用改核心的扫描逻辑:
读取输入时保留索引
比如用Python的话,直接把索引和坐标打包成元组(索引从1还是0开始?看问题要求,一般这类题默认从1开始计数):n = int(input()) points_with_idx = [] for idx in range(1, n+1): x, y = map(int, input().split()) points_with_idx.append( (x, y, idx) )Graham Scan逻辑不用大改
你之前写的排序、极角比较、栈操作这些,只需要把整个元组当成处理对象就行——比较的时候用前两个元素(x,y),索引跟着走,完全不影响核心逻辑。按要求输出结果
当Graham Scan生成最终的点集(比如凸包列表)后,先输出首行的s格式,再依次输出带索引的点:
比如针对示例输入,假设Graham Scan生成的顺序是(0,0,1) → (1,0,3) → (0,1,2),输出就可以是:s = [1, 3, 2] 1: (0, 0) 3: (1, 0) 2: (0, 1)如果首行要求是输出点的数量,那就是
s = 3,再输出点信息。
三、踩坑提醒
- 索引起始值:一定要确认问题要求索引是从0还是1开始,别搞错了导致输出不符合预期
- 顺序一致性:Graham Scan生成的点是按逆时针(或顺时针)排列的,输出时必须严格保持这个顺序,不能乱
- 首行格式:如果问题里的
s...有固定格式(比如s = {1,2,3}用大括号),要严格对应,别用错符号
给你贴个极简的Python示例片段,假设你已经有了graham_scan函数(返回带索引的点列表):
def graham_scan(points): # 你的核心Graham Scan实现,处理(x,y,idx)格式的点 # 返回按扫描顺序排列的凸包点列表 pass # 读入带索引的点 n = int(input()) points = [] for idx in range(1, n+1): x, y = map(int, input().split()) points.append( (x, y, idx) ) # 生成结果点集 result_points = graham_scan(points) # 输出首行 print(f"s = {[p[2] for p in result_points]}") # 输出每个带索引的点 for p in result_points: print(f"{p[2]}: ({p[0]}, {p[1]})")
这样就能完美满足你“按生成的集合输出所有带索引的点”的需求啦。如果还有具体的格式细节要调整,比如首行的s后面的内容、输出点的格式,直接改对应的打印语句就行。
内容的提问来源于stack exchange,提问作者user3016995
相关产品推荐
相关产品推荐

