Task: | Sudoku |
Sender: | |
Submission time: | 2015-08-16 22:34:43 +0300 |
Language: | Java |
Status: | READY |
Result: | 100 |
group | verdict | score |
---|---|---|
#1 | ACCEPTED | 100 |
test | verdict | time | |
---|---|---|---|
#1 | ACCEPTED | 0.20 s | details |
#2 | ACCEPTED | 0.21 s | details |
#3 | ACCEPTED | 0.21 s | details |
#4 | ACCEPTED | 0.21 s | details |
#5 | ACCEPTED | 0.21 s | details |
Code
import java.util.Arrays;import java.util.Scanner;public class Main {private static final int KOKO = 81;private static final int RIVI = 9;private static final int ALITAULU = 3;private static final int[] apu = new int[10];public static void main(String[] args) {Scanner lukija = new Scanner(System.in);String ekaRivi = lukija.nextLine();int[] taulu = luoTaulu(ekaRivi);boolean onnistui = ratko(taulu, 0);if (onnistui) {System.out.println("");for (int i = 1; i <= KOKO; i++) {System.out.print(taulu[i - 1]);if (i % RIVI == 0) {System.out.println("");}}System.out.println("");} else {System.out.println("Ei ratkaisua.");}}private static int[] luoTaulu(String ekaRivi) {int[] taulu = new int[KOKO];int taulunLaskuri = 0;for (int i = 0; i < ekaRivi.length(); i++) {int luku = Character.getNumericValue(ekaRivi.charAt(i));taulu[taulunLaskuri] = luku;taulunLaskuri++;}return taulu;}private static boolean ratko(int[] taulu, int solu) {while (solu < KOKO && taulu[solu] > 0) {solu++;}if (solu == KOKO) {return true;}for (int i = 1; i <= RIVI; i++) {taulu[solu] = i;if (tarkistaSarake(taulu, solu % RIVI)) {if (tarkistaRivi(taulu, solu % RIVI)) {if (tarkistaSolu(taulu, solu % ALITAULU * ALITAULU, solu / RIVI % ALITAULU * ALITAULU)) {if (kelvollinen(taulu) && ratko(taulu, solu + 1)) {return true;}}}}}taulu[solu] = 0;return false;}private static boolean tarkistaSarake(int[] taulu, int sarake) {Arrays.fill(apu, 0);for (int i = 0; i < RIVI; i++) {int solu = taulu[i * RIVI + sarake];if (solu > 0 && ++apu[solu] > 1) {return false;}}return true;}private static boolean tarkistaRivi(int[] taulu, int rivi) {Arrays.fill(apu, 0);for (int i = 0; i < RIVI; i++) {int solu = taulu[rivi * RIVI + i];if (solu > 0 && ++apu[solu] > 1) {return false;}}return true;}private static boolean tarkistaSolu(int[] taulu, int x, int y) {Arrays.fill(apu, 0);for (int i = 0; i < RIVI; i++) {int solu = taulu[(y + i / ALITAULU) * RIVI + (x + i % ALITAULU)];if (solu > 0 && ++apu[solu] > 1) {return false;}}return true;}private static boolean kelvollinen(int[] taulu) {for (int i = 0; i < 9; i++) {if (!tarkistaRivi(taulu, i)) {return false;}if (!tarkistaSarake(taulu, i)) {return false;}if (!tarkistaSolu(taulu, i % ALITAULU * ALITAULU, i / ALITAULU * ALITAULU)) {return false;}}return true;}}
Test details
Test 1
Verdict: ACCEPTED
input |
---|
592836471 |
correct output |
---|
592836471 836471592 471592836 928364715 364715928 ... |
user output |
---|
592836471 134257689 678149235 213465798 ... |
Test 2
Verdict: ACCEPTED
input |
---|
672935418 |
correct output |
---|
672935418 935418672 418672935 729354186 354186729 ... |
user output |
---|
672935418 134268579 589147236 213456897 ... |
Test 3
Verdict: ACCEPTED
input |
---|
329174658 |
correct output |
---|
329174658 174658329 658329174 291746583 746583291 ... |
user output |
---|
329174658 145268379 678359124 213485796 ... |
Test 4
Verdict: ACCEPTED
input |
---|
376958421 |
correct output |
---|
376958421 958421376 421376958 769584213 584213769 ... |
user output |
---|
376958421 124367589 589124367 213475698 ... |
Test 5
Verdict: ACCEPTED
input |
---|
875694321 |
correct output |
---|
875694321 694321875 321875694 756943218 943218756 ... |
user output |
---|
875694321 123578469 469123578 214356897 ... |