OJ题目链接:
http://acm.sjtu.edu.cn/OnlineJudge/problem/1005
是一个计算9*9数独能否合法的题代码如下
找了很久始终有两个点找不到问题,在网上搜了一个和本人实现非常非常像的代码,可以全过….该代码链接:
https://github.com/bertlps/sjtu-onlinejudge/blob/master/%E6%95%B0%E7%8B%AC%E2%80%94%E2%80%941005.cpp
求帮忙指点是哪里的问题>.<
谢谢!
http://acm.sjtu.edu.cn/OnlineJudge/problem/1005
是一个计算9*9数独能否合法的题代码如下
找了很久始终有两个点找不到问题,在网上搜了一个和本人实现非常非常像的代码,可以全过….该代码链接:
https://github.com/bertlps/sjtu-onlinejudge/blob/master/%E6%95%B0%E7%8B%AC%E2%80%94%E2%80%941005.cpp
求帮忙指点是哪里的问题>.<
谢谢!
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(){
int t[9 + 1][9 + 1] = {0};
/*like a bucket sort to check whether it is unique 1~9 or not*/
int check[9 + 1] = {0};
int n;
scanf ( "%d", &n );
int i;
int j;
int turn;
for ( turn = 1; turn <= n; turn ++ ){
int flag = 0;
/*check the row when input*/
for ( i = 1; i <= 9; i ++ ){
for ( j = 1; j <= 9; j ++ ){
scanf ( "%d", &( t[i][j]) );
if ( ( t[i][j] > 9 ) || ( t[i][j] < 1 ) ){
//goto fail;
flag = 1;
}
if ( ( ++ ( check[ t[i][j] ] ) ) != i ){
//goto fail;
flag = 1;
}
}
}
/*use flag not goto, just for input all data of a case, not interrupted*/
if ( flag == 1 ){
goto fail;
}
/*check the col*/
for ( i = 1; i <= 9; i ++ ){
for ( j = 1; j <= 9; j ++ ){
if ( ( -- ( check[ t[j][i] ] ) ) != 9 - i ){
goto fail;
}
}
}
int k;
int p;
int cnt = 0;
/*check nine 3*3 blocks*/
for ( k = 1; k <= 7; k += 3 ){
for ( p = 1; p <= 7; p += 3 ){
cnt ++;
for ( i = k; i <= k + 2; i ++ ){
for ( j = p; j <= p + 2; j ++ ){
if ( ( ++ ( check[ t[i][j] ] ) ) != cnt ){
goto fail;
}
}
}
}
}
printf ( "Right\n" );
getchar();
continue;
fail:
printf ( "Wrong\n" );
getchar();
}
return 0;
}
解决方案
20
看了一下题目 你的肯定不符合题目要求的
1.单次运行你的可能是正确的,
只要出现上一次是错误的输入,下次即便是正确的输入你也会判断错误。 原因是你的 int check[9 + 1] = {0};
这个在 下一次循环的时候没有置空
for ( turn = 1; turn <= n; turn ++ ){
在这里循环的时候应该 设置 check[]的值为0
2. 题目要求是 应该是全部的输入之后, 再给结果吧 你的是每次输入就出结果
1.单次运行你的可能是正确的,
只要出现上一次是错误的输入,下次即便是正确的输入你也会判断错误。 原因是你的 int check[9 + 1] = {0};
这个在 下一次循环的时候没有置空
for ( turn = 1; turn <= n; turn ++ ){
在这里循环的时候应该 设置 check[]的值为0
2. 题目要求是 应该是全部的输入之后, 再给结果吧 你的是每次输入就出结果