1 条题解

  • 1
    @ 2025-4-12 21:26:52

    这个方法有些繁琐,不知有没有更简单的方法。

    写完之后第一次递交,86 Wrong Answer,也就是6对1错,错误显示“Read 6, expect 2.”,发现我在fun()的最前面就判断了方法6的情况,而题目应该是优先判断靠前的方法。将判断方法6的两行挪到5与7之间再递交,100 Accepted。

    解释一下这个方法,运用了Python当中的集合复数,用几何巧妙地解决问题。

    n = int(input())
    m = int(n / 2)
    start = set() # 创建一个空集合
    for i in range(n):
        s = input()
        if n % 2 == 0: # 调整n为偶数的情况
            s = s[:m] + '-' + s[m:]
            if i < m:
                i -= 1
        for j in range(len(s)):
            if s[j] == '@': # 将每一个@转化为一个复数,0是图案的正中心
                start.add((n-i-1-m)*1j+j-m) # 向集合中添加元素
    end = set()
    for i in range(n):
        e = input()
        if n % 2 == 0:
            e = e[:m] + '-' + e[m:]
            if i < m:
                i -= 1
        for j in range(len(e)):
            if e[j] == '@':
                end.add((n-i-1-m)*1j+j-m)
    def right(lst): # 定义函数,获取顺时针旋转90度后的集合
        l = set()
        for c in lst:
            l.add(c*-1j)
        return l
    def fun():
        global start,end
        test = start.copy()
        for i in range(1,4):
            test = right(test)
            if test == end:
                return i
        mirror = set()
        for c in start: # 获取“反射”后的集合
            mirror.add(-c.real + c.imag * 1j)
        if mirror == end:
            return 4
        test = mirror.copy()
        for i in range(1,4):
            test = right(test)
            if test == end:
                return 5
        if start == end:
            return 6
        return 7
    print(fun())
    
    • 1

    【深基5.习11】[USACO1.2] 方块转换 Transformations

    信息

    ID
    693
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    26
    已通过
    3
    上传者