编写一个程序,通过已填充的空格来解决数独问题。

一个数独的解法需遵循如下规则:

数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
空白格用 '.' 表示。

一个数独。

答案被标成红色。

Note:

给定的数独序列只包含数字 1-9 和字符 '.' 。
你可以假设给定的数独只有唯一解。
给定数独永远是 9x9 形式的。

第一反应就是dfs问题

public void solveSudoku(char[][] board) {
      helper(board,0);
}

public boolean helper(char[][] board,int index){
    if(index==81) return true;
    int i=index/9;
    int j=index%9;
    char c=board[i][j];
    if(c!='.'){
        return helper(board,index+1);
    }
    for(int i1=0;i1<9;i1++){
        boolean isValid=true;
        for(int j1=0;j1<9;j1++){
            if(board[i][j1]==(char)(i1+'1')){
                isValid=false;
                break;
            }
            if(board[j1][j]==(char)(i1+'1')){
                isValid=false;
                break;
            }
        }
        if(!isValid){
            continue;
        }
        for(int i2=i/3*3;i2<i/3*3+3 && isValid;i2++){
            for(int j2=j/3*3;j2<j/3*3+3;j2++){
                if(board[i2][j2]==(char)(i1+'1')){
                    isValid=false;
                    break;
                }
            }
        }
        if(isValid){
            board[i][j]=(char)(i1+'1');
            if(helper(board,index+1)) return true;
            board[i][j]='.';
        }
    }
    return false;
}

程浩
21 声望2 粉丝

下一篇 »
38. 报数