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++ , 反而会在下面想如何处理宫位浪费时间
——————————————————————————————————————————————————————————————————————————————————————————————————————————————

浙公网安备 33010602011771号