Add my Java Sudoku solver from college, haha

main
Felix Martin 2021-04-22 14:56:42 -04:00
parent 194393cae3
commit 5681d3a644
2 changed files with 650 additions and 0 deletions

150
java/sudoku.java Normal file
View File

@ -0,0 +1,150 @@
import java.util.*;
import javax.swing.*;
import java.io.IOException;
import java.io.FileReader;
import java.io.Reader;
class Sudoku {
int[] fieldValues = new int[81];
int[] emptyFields;
int currentField;
void printField() {
String fieldOut = "";
int i;
for(i=0; i<81; i++) {
if(i%27 == 0 && i>0) {
fieldOut += "\n---------------------\n";
}
else if(i%9 == 0) {
fieldOut += "\n";
}
else if(i%3 == 0) {
fieldOut += "| ";
}
if(fieldValues[i] != 0) {
fieldOut += fieldValues[i] + " ";
}
else {
fieldOut += " ";
}
}
System.out.println(fieldOut);
}
/** Function asks for an file name which
* should contain a sudoku and this sudoku
* into fieldValues, Empty fields should
* be marked by a '0'
*/
void loadFieldFromFile() {
String fileName = "";
Reader reader = null;
int i = 0;
fileName = JOptionPane.showInputDialog( "Enter filename" );
System.out.println(fileName);
try
{
reader = new FileReader (fileName);
for ( int c; ( c = reader.read() ) != -1; ) {
int v = 0;
v = c - (int) '0';
if( v >= 0 && v <= 9 ) {
fieldValues[i] = v;
i++;
}
if( i > 80 ) break;
}
}
catch ( IOException e) {
System.err.println( "Could not open file " + fileName );
return;
}
finally {
try { reader.close(); } catch ( Exception e ) { e.printStackTrace(); }
}
System.out.println("File loaded");
}
/** Function checks if "number" may be inserted
* in field "index"
*/
boolean isNumberAllowed(int number, int index) {
int i = 0, j = 0;
/* check col */
for(i=index%9; i<81; i+=9) {
if(fieldValues[i] == number)
return false;
}
/* check row */
for(i=index/9*9; i<(index/9*9+9); i++) {
if(fieldValues[i] == number)
return false;
}
/* check field */
int lu = (index/9/3*27) + (index%9/3*3); //first index of field
for(j = 0; j<3; j++) {
for(i = lu+(j*9); i<lu+(j*9)+3; i++) {
if(fieldValues[i] == number)
return false;
}
}
return true;
}
/** Function trys to solve the current sudoku
* using backtracking algorithm
*/
void solveSudoku() {
currentField = 0;
stepAhead();
}
boolean stepAhead() {
if(currentField==81) {
return true;
}
if(fieldValues[currentField] != 0) {
currentField++;
if(stepAhead()) {
return true;
}
}
else {
for(int i = 1; i<=9; i++) {
if(isNumberAllowed(i, currentField)) {
fieldValues[currentField] = i;
currentField++;
if(stepAhead())
return true;
}
}
fieldValues[currentField] = 0;
}
currentField--;
return false;
}
}
/** This class is to test the
* Sudoku class and it's functions
*/
class SudokuDemo {
public static void main(String[] args) {
System.out.println("Sudoku demo loading...");
Sudoku s = new Sudoku();
s.loadFieldFromFile();
s.printField();
//s.testAllowed();
s.solveSudoku();
s.printField();
}
}

500
txt/EulerProblem096.txt Normal file
View File

@ -0,0 +1,500 @@
Grid 01
003020600
900305001
001806400
008102900
700000008
006708200
002609500
800203009
005010300
Grid 02
200080300
060070084
030500209
000105408
000000000
402706000
301007040
720040060
004010003
Grid 03
000000907
000420180
000705026
100904000
050000040
000507009
920108000
034059000
507000000
Grid 04
030050040
008010500
460000012
070502080
000603000
040109030
250000098
001020600
080060020
Grid 05
020810740
700003100
090002805
009040087
400208003
160030200
302700060
005600008
076051090
Grid 06
100920000
524010000
000000070
050008102
000000000
402700090
060000000
000030945
000071006
Grid 07
043080250
600000000
000001094
900004070
000608000
010200003
820500000
000000005
034090710
Grid 08
480006902
002008001
900370060
840010200
003704100
001060049
020085007
700900600
609200018
Grid 09
000900002
050123400
030000160
908000000
070000090
000000205
091000050
007439020
400007000
Grid 10
001900003
900700160
030005007
050000009
004302600
200000070
600100030
042007006
500006800
Grid 11
000125400
008400000
420800000
030000095
060902010
510000060
000003049
000007200
001298000
Grid 12
062340750
100005600
570000040
000094800
400000006
005830000
030000091
006400007
059083260
Grid 13
300000000
005009000
200504000
020000700
160000058
704310600
000890100
000067080
000005437
Grid 14
630000000
000500008
005674000
000020000
003401020
000000345
000007004
080300902
947100080
Grid 15
000020040
008035000
000070602
031046970
200000000
000501203
049000730
000000010
800004000
Grid 16
361025900
080960010
400000057
008000471
000603000
259000800
740000005
020018060
005470329
Grid 17
050807020
600010090
702540006
070020301
504000908
103080070
900076205
060090003
080103040
Grid 18
080005000
000003457
000070809
060400903
007010500
408007020
901020000
842300000
000100080
Grid 19
003502900
000040000
106000305
900251008
070408030
800763001
308000104
000020000
005104800
Grid 20
000000000
009805100
051907420
290401065
000000000
140508093
026709580
005103600
000000000
Grid 21
020030090
000907000
900208005
004806500
607000208
003102900
800605007
000309000
030020050
Grid 22
005000006
070009020
000500107
804150000
000803000
000092805
907006000
030400010
200000600
Grid 23
040000050
001943600
009000300
600050002
103000506
800020007
005000200
002436700
030000040
Grid 24
004000000
000030002
390700080
400009001
209801307
600200008
010008053
900040000
000000800
Grid 25
360020089
000361000
000000000
803000602
400603007
607000108
000000000
000418000
970030014
Grid 26
500400060
009000800
640020000
000001008
208000501
700500000
000090084
003000600
060003002
Grid 27
007256400
400000005
010030060
000508000
008060200
000107000
030070090
200000004
006312700
Grid 28
000000000
079050180
800000007
007306800
450708096
003502700
700000005
016030420
000000000
Grid 29
030000080
009000500
007509200
700105008
020090030
900402001
004207100
002000800
070000090
Grid 30
200170603
050000100
000006079
000040700
000801000
009050000
310400000
005000060
906037002
Grid 31
000000080
800701040
040020030
374000900
000030000
005000321
010060050
050802006
080000000
Grid 32
000000085
000210009
960080100
500800016
000000000
890006007
009070052
300054000
480000000
Grid 33
608070502
050608070
002000300
500090006
040302050
800050003
005000200
010704090
409060701
Grid 34
050010040
107000602
000905000
208030501
040070020
901080406
000401000
304000709
020060010
Grid 35
053000790
009753400
100000002
090080010
000907000
080030070
500000003
007641200
061000940
Grid 36
006080300
049070250
000405000
600317004
007000800
100826009
000702000
075040190
003090600
Grid 37
005080700
700204005
320000084
060105040
008000500
070803010
450000091
600508007
003010600
Grid 38
000900800
128006400
070800060
800430007
500000009
600079008
090004010
003600284
001007000
Grid 39
000080000
270000054
095000810
009806400
020403060
006905100
017000620
460000038
000090000
Grid 40
000602000
400050001
085010620
038206710
000000000
019407350
026040530
900020007
000809000
Grid 41
000900002
050123400
030000160
908000000
070000090
000000205
091000050
007439020
400007000
Grid 42
380000000
000400785
009020300
060090000
800302009
000040070
001070500
495006000
000000092
Grid 43
000158000
002060800
030000040
027030510
000000000
046080790
050000080
004070100
000325000
Grid 44
010500200
900001000
002008030
500030007
008000500
600080004
040100700
000700006
003004050
Grid 45
080000040
000469000
400000007
005904600
070608030
008502100
900000005
000781000
060000010
Grid 46
904200007
010000000
000706500
000800090
020904060
040002000
001607000
000000030
300005702
Grid 47
000700800
006000031
040002000
024070000
010030080
000060290
000800070
860000500
002006000
Grid 48
001007090
590080001
030000080
000005800
050060020
004100000
080000030
100020079
020700400
Grid 49
000003017
015009008
060000000
100007000
009000200
000500004
000000020
500600340
340200000
Grid 50
300200000
000107000
706030500
070009080
900020004
010800050
009040301
000702000
000008006