各位编程高手好,小弟现在遇到一个十分棘手的问题,可谓百思不得其解。
下面是我自己写的一个利用回溯法求解数独的程序。但是不知道为什么,就算我只往第一个格子里输入一个1.
程序运行的结果也是    stackovererror    
march   和   huisu是求解过程的两个 主要成员方法。。
小弟望哪位好心人能不吝赐教,指出我的错误到底在哪,小弟不胜感激!!
import java.io.*;public class Sudoku
{
int [][] board; //宫格内的数字
int [][] flag; //标志值,用来检验对应宫格中的数字是否可以修改 Sudoku()
{   int i,j;
board=new int[9][9];
flag=new int[9][9];
for(i=0;i<9;i++)
for(j=0;j<9;j++)
board[i][j]=1;
}  //构造方法Sudoku()结束 private void outputBoard()
{
        int i,j;
System.out.println("您的数独题的解如下:");
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
    System.out.print(board[i][j]+" ");
System.out.println();
}
}  //输出结果 private void dataInit() throws IOException
{
System.out.println("输入数独题目:");
System.out.println("(输入格式:行,列,数字再回车。如果要结束输题请输入0再回车。)");
while(true)
{
BufferedReader x=new BufferedReader(new InputStreamReader(System.in));
String f=x.readLine();
char[] k=f.toCharArray();
int i,j,a;
i=k[0]-49;
if(i==-1)
break;
j=k[2]-49;
a=k[4]-48;
board[i][j]=a;
flag[i][j]=1;    //(i,j)点坐标的宫格被人为初始化
}
} private boolean dataCheckRow(int m,int n)
{
for(int i=0;i<n;i++)
if(board[m][i]==board[m][n])
return(false);
return(true);
} //检查行内是否数字互不重复 private boolean dataCheckColumn(int m,int n)
{
for(int i=0;i<m;i++)
if(board[i][n]==board[m][n])
return(false);
return(true);
} //检查列内是否数字互不重复 private boolean dataCheckGrid(int m,int n)
{
int i,j,s=m/3,t=n/3;      //s,t分别是该数所在宫的行列数减一
for(i=3*s;i<m;i++)
for(j=3*t;j<3*t+3;j++)
if(board[i][j]==board[m][n])
return(false);
return(true);
} //检查宫内是否数字互不重复 public boolean dataCheck(int m,int n)
{
if(dataCheckRow(m,n))
if(dataCheckColumn(m,n))
if(dataCheckGrid(m,n))
return(true);
return(false);
} private int seekFirst()   //从头往后寻找第一个可修改的宫格
{
int i,j;
for(i=0;i<9;i++)
for(j=0;j<9;j++)
if(flag[i][j]==0)
return(9*i+j);
return(-1);
} private int seekNearest(int m,int n)   //往前寻找距离(m,n)宫格最近的可修改的宫格(待优化Pointer)
{
int i,j,t=-1;
for(i=0;i<=m;i++)
for(j=0;j<9;j++)
if(flag[i][j]==0&&(9*i+j)<(9*m+n))
t=9*i+j;
return(t);
} private void march(int m,int n)      //试探过程
{
if(dataCheck(m,n))
{
if(n==8)
{
if(m==8)
outputBoard();
else 
march(m+1,0);
}
else
march(m,n+1);
}

else
{
if(flag[m][n]==0)  //此宫格可修改
huisu(m,n);
else
{
int t=seekNearest(m,n);
huisu(t/9,t%9);
}
}
}
private void huisu(int m,int n)   //一直回溯到不为9的可修改的宫格
{
if(board[m][n]==9)
{
board[m][n]=1;
int t=seekNearest(m,n);
huisu(t/9,t%9);
}
else
{
board[m][n]++;
march(m,n);
}
}

public static void main(String args[])
{
Sudoku a=new Sudoku();
try
{
a.dataInit();
int first=a.seekFirst();
a.march(first/9,first%9);
}
catch(IOException e)
{
System.err.println("发生异常:"+e);
e.printStackTrace();
}
}
}