- 数独验证
- 2017-12-31 15:22:49 @
若是不判断互异,转而判断各判断区域(一列、一行、3x3等)的数字
\[1+2+3+\cdots+9=45\]
\[1\times2\times3\times\cdots\times9=362880\]
下面给出我的代码,只写了和的部分,理所当然地被卡掉了
```cpp
#include <bits/stdc++.h>
using namespace std;
bool check()
{
int t[9][9];
for (int i = 0; i < 9; i++)
{
int all = 0;
for (int j = 0; j < 9; j++)
{
cin >> t[i][j];
all += t[i][j];
}
if(all != 45)
return false;
}
for (int i = 0; i < 9; i++)
{
int all = 0;
for (int j = 0; j < 9; j++)
{
all += t[j][i];
}
if(all != 45)
return false;
}
int x = 0, y = 0;
for (int i = 0; i < 9; i++)
{
int all = 0;
for (int j = x; j < x + 3; j++)
for (int k = y; k < y + 3; k++)
all += t[j][k];
if(all != 45)
return false;
if(x==6)
{
y += 3;
x = 0;
}
else
{
x += 3;
}
}
return true;
}
int main()
{
int c;
cin >> c;
for (int i = 0; i < c; i++)
{
if(check())
cout << "Right" << endl;
else
cout << "Wrong" << endl;
}
return 0;
}
```
4 条评论
-
cjhcf LV 6 @ 2018-06-27 12:55:01
同样的思路,第一次,第四个测试过不了,该测试应该是全5的情况,添加判定后AC 下面是代码:
#include <stdio.h>
#include <stdlib.h>void judge(int arr[9][9]);
int main()
{
int n=0,num=0;
int arr[9][9];
int i=0,j=0;
scanf("%d",&n);
int k=0;
for(k=0;k<n;k++) {
for(i=0;i<9;i++) {
for(j=0;j<9;j++) {
scanf("%d",&arr[i][j]);
if(arr[i][j]==5) {
num+=arr[i][j];
}
}
}
if(num!=405) {
judge(arr);
} else {
printf("Wrong\n");
}}
return 0;
}void judge(int arr[9][9]) {
//判断行列
int flag1=0,flag2=0; //判断标志
int i=0,j=0;
int sum=0; //记数
for(i=0;i<9;i++) {
for(j=0;j<9;j++) {
sum+=arr[i][j];
}
if(sum!=45){ //累积和为45,则不重复
flag1=1;
break;
}
sum=0;
}
//判断九宫格
int k=0,m=0;
for(m=0;m<9;m+=3){
for(k=0;k<9;k+=3) {
for(i=k;i<3+k;i++) {
for(j=k;j<3+k;j++) {
sum+=arr[i][j];
}
}
if(sum!=45){ //累积和为45,则不重复
flag2=1;
break;
}
sum=0;
}
}
if(flag1==0&&flag2==0) {
printf("Right\n");
} else{
printf("Wrong\n");
}
} -
2018-04-10 18:37:06@
真巧,我三年前也是这么想的。
-
2018-04-10 13:03:45@
找到办法了,考虑到存在81个格子全是5的情况,这里应该再加一个限制条件,就是每行每列每个宫格,乘积应为9!=362880
-
2018-04-10 12:11:50@
感觉应该可行,但是我测试的时候似乎第2个和第9个测试过不了
这是我的代码#include<iostream> #include<vector> using namespace std; int main() { int n; cin >> n; int soduku[9][9]; vector<string> result; bool push = true; for(int i=0;i<n;i++){ for(int j=0;j<9;j++){ for(int k=0;k<9;k++){ cin >> soduku[j][k]; } } int sumrow = 0; int sumcol = 0; int sum = 0; for(int j=0;j<9;j++){ for(int k=0;k<9;k++){ sumrow += soduku[j][k]; sumcol += soduku[k][j]; sum += soduku[j/3*3+k/3][j%3*3+k%3]; } if(sumrow!=45||sumcol!=45||sum!=45){ push = false; } sum = sumrow = sumcol = 0; } //检测数字 if(push) result.push_back("Right"); else result.push_back("Wrong"); } for(int i=0;i<n;i++){ cout << result[i] << endl; } }
- 1