简化判断过程的方法

若是不判断互异,转而判断各判断区域(一列、一行、3x3等)的各数字和为
\[1+2+3+\cdots+9=45\]
是否可行?
我感觉是可以的……下面给出我的代码,思路应该比较清晰……吧?……
```c++
#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;
}
```

3 条评论

  • @ 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
分类
模拟 点击显示
标签
递交数
3922
已通过
1599
通过率
41%
上传者