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. 题目要求是 应该是全部的输入之后, 再给结果吧 你的是每次输入就出结果