找了一天bug。OJ漏点求帮助

C语言 码拜 4年前 (2016-09-15) 507次浏览
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
求帮忙指点是哪里的问题>.<
谢谢!

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

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明找了一天bug。OJ漏点求帮助
喜欢 (0)
[1034331897@qq.com]
分享 (0)