题目
问题 F: 数独验证(二维数组,函数)
时间限制: 1 Sec 内存限制: 128 MB
提交: 101 解决: 57
[提交][状态][讨论版]
题目描述
数独是一种填数游戏,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫(3*3)内的数字均含1-9,不重复。
每个数独有唯一解。下图是一个数独填数后的解(黑色数字是已知数字,绿色数字是填数数字)。
输入填数后的9×9盘面,写函数判断其是否是解,返回1或0。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/79159a68a0155d1687276e9e72a177b3.png)
输入
测试次数
每组测试数据是1个9*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");
}
}