题目来源: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; }