题目:数独验证

题目
问题 F: 数独验证(二维数组,函数)
时间限制: 1 Sec  内存限制: 128 MB
提交: 101  解决: 57
[提交][状态][讨论版]
题目描述
数独是一种填数游戏,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫(3*3)内的数字均含1-9,不重复。

每个数独有唯一解。下图是一个数独填数后的解(黑色数字是已知数字,绿色数字是填数数字)。

输入填数后的9×9盘面,写函数判断其是否是解,返回10

在这里插入图片描述

输入
测试次数

每组测试数据是19*9的数字阵(元素值:1~9)

输出
每组测试数据,如果满足数独要求,输出YES,否则输出NO

样例输入
2
6 8 2 3 7 4 9 1 5
7 1 5 6 2 9 3 4 8
3 4 9 8 5 1 6 7 2
4 9 3 2 6 7 5 8 1
1 5 7 4 8 3 2 6 9
8 2 6 9 1 5 4 3 7
9 6 1 5 3 8 7 2 4
2 7 4 1 9 6 8 5 3
5 3 8 7 4 2 1 9 6
1 2 3 4 5 6 7 8 9
2 3 4 5 6 7 8 9 1
3 4 5 6 7 8 9 1 2
4 5 6 7 8 9 1 2 3
5 6 7 8 9 1 2 3 4
6 7 8 9 1 2 3 4 5
7 8 9 1 2 3 4 5 6
8 9 1 2 3 4 5 6 7
9 1 2 3 4 5 6 7 8

样例输出
YES
NO
代码块
#include <stdio.h>

int function(int a[9][9])
{
    int i, j, k, l, m;
    for(i=0; i<9; i++)
    {
        for(j=1; j<=9; j++)
        {
            for(k=0; k<9; k++)
            {
                if(a[i][k]==j)
                    break;
            }
            if(k==9)
                return 0;
        }
    }
    for(i=0; i<9; i++)
    {
        for(j=1; j<=9; j++)
        {
            for(k=0; k<9; k++)
            {
                if(a[k][i]==j)
                    break;
            }
            if(k==9)
                return 0;
        }
    }
    for(i=0; i<9; i+=3)
    {
        for(j=0; j<9; j+=3)
        {
            for(k=1; k<=9; k++)
            {
                for(l=i; l<i+3; l++)
                {
                    for(m=j; m<j+3; m++)
                    {
                        if(a[l][m]==k)
                            break;
                    }
                    if(a[l][m]==k)
                        break;
                }
                if(l==i+3)
                    return 0;
            }
        }
    }
    return 1;
}

int main(void)
{
    int i, j, t;
    scanf("%d", &t);
    while(t--)
    {
        int a[9][9];
        for(i=0; i<9; i++)
            for(j=0; j<9; j++)
                scanf("%d", &a[i][j]);
        if(function(a))
            printf("YES\n");
        else
            printf("NO\n");
    }
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值