青年杯,题解 12 2

    破解石碑中的三阶秘阵题解

    来源 九宫幻方

    思想

    • 极致的暴力,极致的享受。
    • 将九宫格视为一维数组
    • 列举出所有的情况,进行枚举比较,合法则方案加一。
    #include <bits/stdc++.h>
    using namespace std;
    const int N = 10;                         // 数字的最大值 + 1
    int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; // 数字 1-9
    int grid[10];                             // 存储矩阵转为一维的结果
    set<int> sums;                            // 用于记录行列的和
    int result[10];                           // 存储符合条件的幻方结果
    int validCount = 0;                       // 记录找到的符合条件的幻方数量
    
    // 检查是否能形成幻方
    bool isMagicSquare()
    {
        sums.clear(); // 清空之前的和
    
        // 校验输入的数字是否与原始的数字 1-9 匹配
        for (int i = 1; i <= 9; ++i)
            if (grid[i] != 0 && grid[i] != a[i])
                return false; // 若输入数字与目标数字不同,则不符合
    
        // 计算每行、每列的和
        for (int i = 1; i <= 3; ++i)
        {
            int rowSum = 0, colSum = 0;
            for (int j = 1; j <= 3; ++j)
            {
                rowSum += a[(i - 1) * 3 + j]; // 行和
                colSum += a[(j - 1) * 3 + i]; // 列和
            }
            sums.insert(rowSum);
            sums.insert(colSum);
        }
    
        // 计算两条对角线的和
        int diag1 = a[1] + a[5] + a[9]; // 主对角线
        int diag2 = a[3] + a[5] + a[7]; // 副对角线
        sums.insert(diag1);
        sums.insert(diag2);
    
        // 如果所有和都相等,那么就符合幻方条件
        if (sums.size() == 1)
        {
            memcpy(result, a, sizeof result); // 记录结果
            return true;
        }
        return false;
    }
    
    int main()
    {
        int num;
    
        // 输入3x3矩阵并转为一维矩阵 grid1
        for (int i = 1; i <= 3; ++i)
            for (int j = 1; j <= 3; ++j)
            {
                cin >> num;
                grid[(i - 1) * 3 + j] = num;
            }
    
        // 遍历所有数字排列
        do
        {
            if (isMagicSquare())
                validCount++; // 如果是幻方,计数
            if (validCount > 1)
                break; // 如果找到多个幻方,提前结束
        } while (next_permutation(a + 1, a + 10)); // 获取下一个排列
    
        // 输出结果
        if (validCount == 1)
            for (int i = 1; i <= 3; ++i)
            {
                for (int j = 1; j <= 3; ++j)
                    cout << result[(i - 1) * 3 + j] << " "; // 输出符合条件的幻方
                cout << endl;
            }
        else
            cout << "Too Many" << endl; // 如果找到多个或没有找到,输出 Too Many
    
        return 0;
    }
    
    

    题解.md

    LXX
    我们的征途是星辰大海
    Warning: Undefined array key "HTTP_ACCEPT_LANGUAGE" in /usr/home/LXX123/domains/www.lxxblog.cfd/public_html/usr/themes/Farallon/comments.php on line 4 Deprecated: stripos(): Passing null to parameter #1 ($haystack) of type string is deprecated in /usr/home/LXX123/domains/www.lxxblog.cfd/public_html/usr/themes/Farallon/comments.php on line 4
    1. 破解石碑中的三阶秘阵 - Lxx's Blog
      2024-11-09 19:45

      [...]8 3 4测试用例.zipcode.cpp题解[...]

    2. 青年杯出题 - Lxx's Blog
      2024-11-09 21:23

      [...]题目列表古代王国的正交拉丁方阵秘文破解石碑中的三阶秘阵二进制谜题:中位数的秘密题解列表古代王国的正交拉丁方阵秘文题解破解石碑中的三阶秘阵题解二进制谜题:中位数的秘密题解[...]