rendered paste bodyimport 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;
}
}