1005. 数独

题目来源:https://acm.sjtu.edu.cn/OnlineJudge/problem/1005

题目描述

数独游戏,具体规则如下:

每一行都用到1,2,3,4,5,6,7,8,9, 位置不限,

每一列都用到1,2,3,4,5,6,7,8,9, 位置不限,

每3*3的格子(共9个这样的格子)都用到1,2,3,4,5,6,7,8,9, 位置不限,

游戏过程就是用1,2,3,4,5,6,7,8,9填充空白,并满足每行,每列,每个九宫格都用到1,2,3,4,5,6,7,8,9,

如下是个正确的sudoku:

数独

输入格式

输入n个数独,你来验证它是否违反规则。

第一行为数独个数,第二行开始为第一个数独,之后第二个,至第n个。

注意:每个数独间有个回车隔开。

输出格式

若正确则输出"Right",否则输出"Wrong", 输出一个换一行。

说明

1<=n<=20(输入的数独个数)

不论输入的数独是否正确,数据保证每个数都在1-9间。

Sample Input

2
5 8 1 4 9 3 7 6 2
9 6 3 7 1 2 5 8 4
2 7 4 8 6 5 9 3 1
1 2 9 5 4 6 3 7 8
4 3 6 1 8 7 2 9 5
7 5 8 3 2 9 1 4 6
8 9 2 6 7 1 4 5 3
6 1 5 9 3 4 8 2 7
3 4 7 2 5 8 6 1 9

1 2 3 4 5 6 7 8 9
2 3 4 5 6 7 8 9 1
3 4 5 6 7 8 9 1 2
4 5 6 7 8 9 1 2 3
5 6 7 8 9 1 2 3 4
6 7 8 9 1 2 3 4 5
7 8 9 1 2 3 4 5 6
8 9 1 2 3 4 5 6 7
9 1 2 3 4 5 6 7 8

Sample Output

Right
Wrong

解题:

  此题只是对传统数独的校验,较为简单,分别校验行,列,小块

答案:

import java.util.HashSet;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[][][] sudoku = new int[n][9][9];
        boolean[] check = new boolean[n];
        for (int i = 0; i < n; i++) {
            check[i] = true;
            for (int j = 0; j < 9; j++) {
                HashSet<Integer> seth = new HashSet();
                for (int k = 0; k < 9; k++) {
                    sudoku[i][j][k] = sc.nextInt();
                    seth.add(sudoku[i][j][k]);
                }
                if (seth.size() < 9) {
                    check[i] = false;
                }
            }
        }
        for (int i = 0; i < n; i++) {
            if (check[i]) {
                for (int j = 0; j < 9; j++) {
                    HashSet setl = new HashSet();
                    for (int k = 0; k < 9; k++) {
                        setl.add(sudoku[i][k][j]);
                    }
                    if (setl.size() < 9) {
                        check[i] = false;
                    }
                }
            }
        }
        for (int i = 0; i < n; i++) {
            if (check[i]) {
                for (int j = 0; j < 9; j++) {
                    HashSet set = new HashSet();
                    int countl = 0;
                    for (int k = 0; k < 3; k++) {
                        int counth = 0;
                        for (int l = 0; l < 3; l++) {
                            set.add(sudoku[i][k + countl][l + counth]);
                        }
                        counth += 3;
                    }
                    countl += 3;
                    if (set.size() < 9) {
                        check[i] = false;
                    }
                }
            }
        }

        for (int i = 0; i < n; i++) {
            System.out.println(check[i] ? "Right" : "Wrong");
        }
    }
}

or

import java.util.Arrays;
import java.util.Scanner;
 
public class Main {
 
    private static Scanner in;
 
    public static void main(String[] args) {
        in = new Scanner(System.in);
        int n = in.nextInt();
        outer:
        for(int t=0;t<n;t++){
            int factor[][]=new int[9][9];
            for(int i=0;i<9;i++){
                for(int j=0;j<9;j++){
                    factor[i][j]=in.nextInt();
                }
            }
            for(int i=0;i<9;i+=3){
                for(int j=0;j<9;j+=3){
                    int s[]=new int[9];
                    int f=0;
                    for(int h=i;h<i+3;h++){
                        for(int k=j;k<j+3;k++){
                            s[f]=factor[h][k];
                            f++;
                        }
                    }
                    Arrays.sort(s);
                    for(int h=0;h<8;h++){
                        if(s[h]==s[h+1]){
                            System.out.println("Wrong");
                            continue outer;
                        }
                    }
                }
 
            }
            for(int i=0;i<9;i++){
                int s[]=new int[9];
                for(int j=0;j<9;j++){
                    s[j]=factor[i][j];
                }
                Arrays.sort(s);
                for(int h=0;h<8;h++){
                    if(s[h]==s[h+1]){
                        System.out.println("Wrong");
                        continue outer;
                    }
                }
                 
            }
            for(int i=0;i<9;i++){
                int s[]=new int[9];
                for(int j=0;j<9;j++){
                    s[j]=factor[j][i];
                }
                Arrays.sort(s);
                for(int h=0;h<8;h++){
                    if(s[h]==s[h+1]){
                        System.out.println("Wrong");
                        continue outer;
                    }
                }
            }
            System.out.println("Right");
        }
    }
 
}

 or

#include <iostream>
#include <algorithm>
using namespace std;

bool isunique(int a[])
{
    bool flag = true;
    sort(a, a + 9);
    for (int i = 0; i < 9; i++)
        if (a[i] != i + 1)
        {
        flag = false;
        break;
        }
    return flag;
}
string issudoku()
{
    string si;
    int su[9][9], s[9];
    for (int i = 0; i < 9; i++)
        for (int j = 0; j < 9; j++)
            cin >> su[i][j];
    bool flag = true;
    for (int i = 0; i < 9; i++)
    {
        for (int j = 0; j < 9; j++)
            s[j] = su[i][j];
        if (!isunique(s))
        {
            flag = false;
            break;
        }
    }
    for (int i = 0; i < 9; i++)
    {
        for (int j = 0; j < 9; j++)
            s[j] = su[j][i];
        if (!isunique(s))
        {
            flag = false;
            break;
        }
    }
    for (int i = 0; i < 9; i += 3)
        for (int j = 0; j < 9; j += 3)
        {
        for (int m = 0; m < 3; m++)
            for (int n = 0; n < 3; n++)
                s[3 * m + n] = su[i + m][j + n];
        if (!isunique(s))
        {
            flag = false;
            break;
        }
        }
    if (flag)
        si = "Right";
    else
        si = "Wrong";
    return si;
}
int main()
{
    int n;
    cin >> n;
    string s[20];
    for (int i = 0; i < n; i++)
        s[i] = issudoku();
    for (int i = 0; i < n; i++)
        cout << s[i] << endl;
    return 0;

}
原文地址:https://www.cnblogs.com/chenglc/p/10869866.html