简化判断过程的方法

若是不判断互异,转而判断各判断区域(一列、一行、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 条评论

  • @ 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

信息

ID
1335
难度
4
分类
模拟 点击显示
标签
递交数
5140
已通过
1985
通过率
39%
被复制
20
上传者