import java.util.Scanner; import java.io.*; class Sudoku{ public static void main( String[] args ){ int[][] G = new int[10][10]; int[][][] poss = new int[10][10][10]; Scanner sc = null; if(args.length !=1) Usage(); try{ sc = new Scanner(new File(args[0])); }catch(FileNotFoundException e){ System.err.println(e.getMessage()); Usage(); } getGrid(G, sc); printGrid(G); initPoss(poss,G); //while(!isSolved(G)){ solveGrid(G,poss); upGrid(G, poss); //} // solveGrid(G,poss); // upGrid(G, poss); // solveGrid(G,poss); // upGrid(G, poss); printGrid(G); } static void getGrid(int[][] G, Scanner sc){ for(int i=1;i<=9;i++){ for(int j=1;j<=9;j++){ G[i][j] = sc.nextInt(); } } } static void Usage(){ System.out.println("Usage: java Soduko input_file"); System.exit(1); } static void printGrid(int[][] G){ System.out.println(); for(int i=1;i<=9;i++){ for(int j=1;j<=9;j++){ if(G[i][j]==0){ System.out.print("- "); }else{ System.out.print(G[i][j]+" "); } if((j%3)==0) System.out.print(" "); } System.out.println(); if((i%3)==0) System.out.println(); } } static void initPoss(int[][][] poss, int[][]G){ for(int i=1;i<=9;i++){ for(int j=1;j<=9;j++){ if(G[i][j]==0){ poss[i][j][0]=9; for(int k=1;k<=9;k++){ poss[i][j][k]=1; } } if(G[i][j]!=0){ poss[i][j][0]=1; poss[i][j][G[i][j]]=1; for(int b=1;b<=9;b++){ if(b!=G[i][j]) poss[i][j][b]=0; } } } } } static void solveGrid(int[][] G, int[][][] possible){ for(int i=1;i<=9;i++){ for(int j=1;j<=9;j++){ System.out.println("i & j:"+i+" "+j); if(G[i][j]==0){ lookRow(G,possible,i,j); System.out.println("i,j: "+possible[i][j][0]); lookCol(G,possible,j,j); System.out.println("i,j: "+possible[i][j][0]); lookBox(G,possible,i,j); System.out.println("i,j: "+possible[i][j][0]); } } } } static void lookRow(int[][] G, int[][][] possible, int i,int j){ for(int l=1;l<=9;l++){ int m=G[i][l]; if((possible[i][j][m]==1)&&(possible[i][j][0]>1)){ possible[i][j][m]=0; possible[i][j][0]--; } } } static void lookCol(int[][] G, int[][][] possible, int i,int j){ for(int l=1;l<=9;l++){ int m=G[l][j]; System.out.println(m); System.out.println("possible(out): "+possible[i][j][m]+" "+possible[i][j][0]); if((possible[i][j][m]==1)&&(possible[i][j][0]>1)){ possible[i][j][m]=0; possible[i][j][0]--; } } } static void lookBox(int[][] G, int[][][] possible, int i, int j){ int rowstart=-1,colstart=-1,rowend=-1,colend=-1; if(i<=3){ rowstart=1; rowend=3; }else if((i>=4)&&(i<=6)){ rowstart=4; rowend=6; }else if(i>=7){ rowstart=7; rowend=9; } if(j<=3){ colstart=1; colend=3; }else if((j>=4)&&(j<=6)){ colstart=4; colend=6; }else if(j>=7){ colstart=7; colend=9; } //System.out.println("row+colstart,end:"+rowstart+" "+rowend+" "+colstart+" "+colend); for(int bi=rowstart;bi<=rowend;bi++){ for(int bj=colstart;bj<=colend;bj++){ int m = G[bi][bj]; if((possible[i][j][m]==1)&&(possible[i][j][0]>1)){ possible[i][j][m]=0; possible[i][j][0]--; System.out.println("possible["+i+"]["+j+"]: "+possible[i][j][0]); } } } } static void upGrid(int[][] G, int[][][] poss){ for(int i=1;i<=9;i++){ for(int j=1;j<=9;j++){ if(G[i][j]!=0) continue; if(poss[i][j][0]!=1) continue; for(int m=1;m<=9;m++){ if(poss[i][j][m]==1) G[i][j]=m; } } } } static boolean isSolved(int[][] G){ for(int i=1;i<=9;i++){ for(int j=1;j<=9;j++){ if(G[i][j]==0) return false; } } return true; } }