L1-104 九宫格(分数20)

题目描述

游戏规则是:将一个 9×9 的正方形区域分成 9 个 3×3 的正方形宫位,并且保证1到9这九个数字在每一行,每一列,每一个宫位都只出现一次。

输入格式

给出一个正整数n,随后给出n个填好数的九宫格,请你分别判断它们是否满足游戏规则。

输出格式

对于满足规则的九宫格, 输出 1 ,否则输出 0。

解题思路

可以用set来检查每一行,每一列,和每一个宫位,没啥难点,但是检查宫位的时候比较麻烦,直接上代码。

#include <iostream>
#include <vector>
#include <set>

using namespace std;

int main()
{
    int n;
    if (!(cin >> n))
    {
        return 0;
    }

    while (n--)
    {
        int grid[9][9];
        bool ok = true;

        for (int i = 0; i < 9; i++)
        {
            for (int j = 0; j < 9; j++)
            {
                cin >> grid[i][j];
            }
        }

        // 1. 校验每一行
        for (int i = 0; i < 9; i++)
        {
            set<int> s;
            for (int j = 0; j < 9; j++)
            {
                if (grid[i][j] >= 1 && grid[i][j] <= 9)
                {
                    s.insert(grid[i][j]);
                }
            }
            if (s.size() != 9) ok = false;
        }

        // 2. 校验每一列
        for (int j = 0; j < 9; j++)
        {
            set<int> s;
            for (int i = 0; i < 9; i++)
            {
                if (grid[i][j] >= 1 && grid[i][j] <= 9)
                {
                    s.insert(grid[i][j]);
                }
            }
            if (s.size() != 9) ok = false;
        }

        // 3. 校验九宫格 (3x3)
        for (int r = 0; r < 9; r += 3)
        {
            for (int c = 0; c < 9; c += 3)
            {
                set<int> s;
                for (int i = r; i < r + 3; i++)
                {
                    for (int j = c; j < c + 3; j++)
                    {
                        if (grid[i][j] >= 1 && grid[i][j] <= 9)
                        {
                            s.insert(grid[i][j]);
                        }
                    }
                }
                if (s.size() != 9) ok = false;
            }
        }

        if (ok)
        {
            cout << 1 << endl;
        }
        else
        {
            cout << 0 << endl;
        }
    }

    return 0;
}

反思

使用循环结构要懂得变通

  • 有时候 变量i或j可以在循环外面定义,因为有时候会用到最后的i或j,而不用额外开两个变量 去想方设法记录i或j

  • 有时候循环条件可以不写,在循环里,在具体情况下去停止。

  • 有时候,不一定要在循环语句中写更新条件,可以在具体情况下更新;更新的时候也要变通,一定要写成i++吗,比如本题i+=3,如果下意识地写i++ , 反而会在下面想如何处理宫位浪费时间

——————————————————————————————————————————————————————————————————————————————————————————————————————————————

posted @ 2026-03-13 17:33  shuiwangrenjia  阅读(2)  评论(0)    收藏  举报