You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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应该只处理了坐标,现在只需要把每个点的索引存进去就行,不用改核心的扫描逻辑:

  1. 读取输入时保留索引
    比如用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) )
    
  2. Graham Scan逻辑不用大改
    你之前写的排序、极角比较、栈操作这些,只需要把整个元组当成处理对象就行——比较的时候用前两个元素(x,y),索引跟着走,完全不影响核心逻辑。

  3. 按要求输出结果
    当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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:41:34