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 ... |