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

构建0/1二维矩阵的旋转镜像无关无碰撞唯一识别函数

0/1矩阵旋转镜像不变的唯一标识符生成方案

核心逻辑

这事儿本质是生成矩阵在二面体群D₄(含4种旋转+4种镜像翻转,共8种变换)下的等价类唯一标识。要实现无碰撞,关键是给每个等价类指定一个唯一的「标准代表」,再基于这个代表生成标识——同一等价类的矩阵无论怎么旋转镜像,最终都会映射到同一个标准代表,不同等价类的标准代表必然不同。

具体实现步骤

1. 生成所有8种变换后的矩阵

先实现矩阵的8种基础变换:

  • 原矩阵(0°旋转)
  • 顺时针旋转90°
  • 顺时针旋转180°
  • 顺时针旋转270°
  • 水平镜像翻转
  • 水平镜像后顺时针旋转90°
  • 水平镜像后顺时针旋转180°
  • 水平镜像后顺时针旋转270°

变换实现参考:比如顺时针90°旋转时,原矩阵的(i,j)位置元素会对应到新矩阵的(j, n-1-i)(n为矩阵边长,8×8则n=8)。

2. 确定等价类的标准代表

把8种变换后的矩阵转换成可比较的标准化形式,再选其中的「最小值」作为标准代表:

  • 标准化方式:将矩阵按行优先展平为0/1字符串,或者直接转成64位整数(8×8共64个布尔值,刚好适配64位无符号整数)。
  • 取最小值:比如对8个展平后的字符串取字典序最小的,或者对8个整数取数值最小的——这个最小值就是整个等价类的唯一标识。

3. 无碰撞标识生成

因为8×8矩阵最多只有64位数据,用64位整数完全可以无碰撞存储单个矩阵的展平值。同一等价类的8个变换对应的整数中,最小值是唯一的;不同等价类的最小值不可能重复(否则两个矩阵属于同一等价类,矛盾)。

代码示例(Python)

def matrix_to_uint64(matrix):
    """把8×8布尔矩阵转成64位无符号整数"""
    val = 0
    for row in matrix:
        for bit in row:
            val = (val << 1) | (1 if bit else 0)
    return val

def rotate_90(matrix):
    """顺时针旋转90°"""
    n = len(matrix)
    return [[matrix[n-1-j][i] for j in range(n)] for i in range(n)]

def flip_horizontal(matrix):
    """水平镜像翻转"""
    return [row[::-1] for row in matrix]

def get_all_transforms(matrix):
    """生成8种变换后的矩阵"""
    transforms = []
    current = matrix
    # 添加4种旋转
    for _ in range(4):
        transforms.append(current)
        current = rotate_90(current)
    # 添加4种镜像+旋转
    flipped = flip_horizontal(matrix)
    current = flipped
    for _ in range(4):
        transforms.append(current)
        current = rotate_90(current)
    return transforms

def get_unique_identifier(matrix):
    """生成旋转镜像不变的唯一标识符"""
    all_vals = [matrix_to_uint64(m) for m in get_all_transforms(matrix)]
    return min(all_vals)

内容的提问来源于stack exchange,提问作者F.P

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 01:03:12