L-104九宫格
九宫格是一款数字游戏,传说起源于河图洛书,现代数学中称之为三阶幻方。游戏规则是:将一个 9×9 的正方形区域划分为 9 个 3×3 的正方形宫位,要求 1 到 9 这九个数字中的每个数字在每一行、每一列、每个宫位中都只能出现一次。
本题并不要求你写程序解决这个问题,只是对每个填好数字的九宫格,判断其是否满足游戏规则的要求。
输入格式:
输入首先在第一行给出一个正整数 n(≤10),随后给出 n 个填好数字的九宫格。每个九宫格分 9 行给出,每行给出 9 个数字,其间以空格分隔。
输出格式:
对每个给定的九宫格,判断其中的数字是否满足游戏规则的要求。满足则在一行中输出 1,否则输出 0。
#include <stdio.h> // 检查行和列是否有重复数字 int checkRowColumn(int map[9][9]) { for (int i = 0; i < 9; i++) { // 遍历每一行和每一列 int flagRow[10] = {0}, flagCol[10] = {0}; // 初始化标记数组 for (int j = 0; j < 9; j++) { // 遍历当前行和列 if (flagRow[map[i][j]] || flagCol[map[j][i]]) // 如果当前数字已经出现过 return 0; // 返回 0,表示无效 flagRow[map[i][j]] = 1; // 标记当前数字已出现 flagCol[map[j][i]] = 1; // 标记当前数字已出现 } } return 1; // 返回 1,表示有效 } // 检查每个 3x3 小宫格是否有重复数字 int checkSubgrid(int map[9][9]) { for (int ii = 0; ii < 9; ii += 3) { // 遍历每个小宫格的起始行 for (int jj = 0; jj < 9; jj += 3) { // 遍历每个小宫格的起始列 int flag[10] = {0}; // 初始化标记数组 for (int i = ii; i < ii + 3; i++) { // 遍历当前小宫格的行 for (int j = jj; j < jj + 3; j++) { // 遍历当前小宫格的列 if (flag[map[i][j]]) // 如果当前数字已经出现过 return 0; // 返回 0,表示无效 flag[map[i][j]] = 1; // 标记当前数字已出现 } } } } return 1; // 返回 1,表示有效 } int main() { int n; scanf("%d", &n); // 输入测试用例的数量 int map[9][9]; // 定义一个 9x9 的数独矩阵 while (n--) { // 对每个测试用例进行处理 int hasError = 0; // 用于标记输入是否合法 for (int i = 0; i < 9; i++) { // 遍历每一行 for (int j = 0; j < 9; j++) { // 遍历每一列 scanf("%d", &map[i][j]); // 输入数独的每个数字 if (map[i][j] <= 0 || map[i][j] >= 10) // 如果数字不在 1-9 范围内 hasError = 1; // 标记为错误 } } if (hasError) { // 如果输入不合法 printf("0\n"); // 直接输出 0 continue; // 跳过后续检查 } // 检查行、列和小宫格是否有效 int isValid = checkRowColumn(map) && checkSubgrid(map); printf("%d\n", isValid); // 输出检查结果 } return 0; }
- continue:跳过当前测试用例的后续检查,直接进入 while 循环的下一次迭代(即处理下一个测试用例)。