文章作者:姜南(Slyar) 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。
背景 Background
BNUEP风靡一款智力游戏,也就是数独(九宫格),先给你一个数独,并需要你验证是否符合规则。
描述 Description
具体规则如下:
每一行都用到1,2,3,4,5,6,7,8,9,位置不限,
每一列都用到1,2,3,4,5,6,7,8,9,位置不限,
每3×3的格子(共九个这样的格子)都用到1,2,3,4,5,6,7,8,9,位置不限,
游戏的过程就是用1,2,3,4,5,6,7,8,9填充空白,并要求满足每行、每列、每个九宫格都用到1,2,3,4,5,6,7,8,9。
如下是一个正确的数独:
5 8 1 4 9 3 7 6 2
9 6 3 7 1 2 5 8 4
2 7 4 8 6 5 9 3 1
1 2 9 5 4 6 3 7 8
4 3 6 1 8 7 2 9 5
7 5 8 3 2 9 1 4 6
8 9 2 6 7 1 4 5 3
6 1 5 9 3 4 8 2 7
3 4 7 2 5 8 6 1 9
输入格式 Input Format
输入n个数独,你来验证它是否违反规则.
第一行为数独个数,第二行开始为第一个数独,之后为第二个,至第n个.
注意!每个数独之间有一个回车隔开!
输出格式 Output Format
若正确则输出”Right”若不正确则输出”Wrong” 输出一个换一行.
Tip:哎,这题真是跌宕起伏啊,不想考察每个数字使用的次数,那样太麻烦,于是就想到了每行每列每3*3小格的数字和为45,这样做完WA了,检查后发现不能边读入边判断,因为那样break后下次还是从中断的地方开始读,所以只能先读完再判断。可是再次WA了,考虑了一会恍然大悟,有数字全部都是5的情况。。。我XXXX
#include <stdio.h>
int sign,a[10][10];
void calc(int x)
{
int s1=0,s2=0,s3=0,i,j;
for(i=x;i<=x+2;i++)
{
for(j=1;j<=3;j++) s1+=a[i][j];
for(j=4;j<=6;j++) s2+=a[i][j];
for(j=7;j<=9;j++) s3+=a[i][j];
}
if((s1!=45)||(s2!=45)||(s3!=45)) sign=0;
}
int main()
{
int i,j,n,sum;
scanf(“%d”,&n);
while(n–)
{
sign=1;
for(i=1;i<=9;i++)
{
for(j=1;j<=9;j++)
{
scanf(“%d”,&a[i][j]);
}
}
for(i=1;i<=9;i++)
{
sum=0;
for(j=1;j<=9;j++)
{
if(a[i][j]==5) sum++;
}
if (sum>1)
{
sign=0;
break;
}
}
if(sign)
{
for(i=1;i<=9;i++)
{
sum=0;
for(j=1;j<=9;j++) sum+=a[i][j];
if(sum!=45)
{
sign=0;
break;
}
}
}
if(sign)
{
for(j=1;j<=9;j++)
{
sum=0;
for(i=1;i<=9;i++) sum+=a[i][j];
if(sum!=45)
{
sign=0;
break;
}
}
}
if(sign) calc(1);
if(sign) calc(4);
if(sign) calc(7);
if(sign) printf(“Right\n”);
else printf(“Wrong\n”);
scanf(“”);
}
system(“pause”);
return 0;
}
转载请注明:Slyar Home » Vijos P1335 数独验证 C语言版