__Firmiana__ 2020-07-14 15:46 采纳率: 0%
浏览 21
已结题

LeetCode第37题,不知道自己的有错误的算法能不能改进至正确

报错是StackOverflow,自己感觉自己算法对空间的要求并不高,自我感觉写的也是尾递归,不明白自己错误的关键所在,希望能教自己一下

class Solution {
    int[][] rows = new int[9][9];
    int[][] col = new int[9][9];
    int[][] sbox = new int[9][9];
    Stack<char[][]> boardst=new Stack<>();
    Stack<Integer> rowstack=new Stack<>();
    Stack<Integer> colstack=new Stack<>();
    Stack<Integer> numstack=new Stack<>();
    public void solveSudoku(char[][] board) {
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
                if (board[i][j]!='.'){
                    int num = board[i][j] - '1';
                    int index_box = (i/3)*3+j/3;
                    rows[i][num]=1;
                    col[j][num]=1;
                    sbox[index_box][num]=1;
                }
            }
        }
        boardst.push(board);
        rowstack.push(0);
        colstack.push(0);
        numstack.push(1);
        recursion(board,0,0,1);
    }

    public void recursion(char[][]board,int row,int column,int num)
    {
        //需要换到下一行
        if(column==9) recursion(board,row+1,0,num);
        //终止条件
        else if(row==9);
        //位置已有数
        else if(board[row][column]!='.') recursion(board,row,column+1,1);
        //位置无数
        else if(board[row][column]=='.')
        {
            if(num==10)
            {
                //回溯——还原上一次更改时的状态
                rows[rowstack.peek()][numstack.peek()-1]=0;
                col[colstack.peek()][numstack.peek()-1]=0;
                sbox[(rowstack.peek()/3)*3+colstack.peek()/3][numstack.peek()-1]=0;
                recursion(boardst.pop(),rowstack.pop(),colstack.pop(),numstack.pop()+1);
            }
            else
            {
                for(int i=num;i<=9;i++)
                {
                    if(rows[row][i-1]==0&&col[column][i-1]==0&&sbox[(row/3)*3+column/3][i-1]==0)
                    {
                        //每做出一次更改就把相关记录入栈
                        char [][]prev = new char[9][9];
                        for(int j=0;j<9;j++)
                        {
                            for(int k=0;k<9;k++)
                            {
                                prev[j][k]=board[j][k];
                            }
                        }
                        boardst.push(prev);
                        rowstack.push(row);
                        colstack.push(column);
                        numstack.push(i);
                        rows[row][i-1]=1;
                        col[column][i-1]=1;
                        sbox[(row/3)*3+column/3][i-1]=1;
                        board[row][column]=(char)(i+'0');
                        recursion(board,row,column+1,1);
                        break;
                    }
                    //如果这个位置无数可填
                    if(i==9)
                    {
                        //回溯——还原上一次更改时的状态
                        rows[rowstack.peek()][numstack.peek()-1]=0;
                        col[colstack.peek()][numstack.peek()-1]=0;
                        sbox[(rowstack.peek()/3)*3+colstack.peek()/3][numstack.peek()-1]=0;
                        recursion(boardst.pop(),rowstack.pop(),colstack.pop(),numstack.pop()+1);
                    }
                }
            }
        }
    }
}
  • 写回答

7条回答 默认 最新

  • 波塞冬的祝福 2020-07-14 15:50
    关注
     就是一个DFS...你找对方法 怎么塞数字,然后塞到不对的时候,清除当前状态换下一个
    
    评论

报告相同问题?

悬赏问题

  • ¥20 c语言写的8051单片机存储器mt29的模块程序
  • ¥60 求直线方程 使平面上n个点在直线同侧并且距离总和最小
  • ¥50 java算法,给定试题的难度数量(简单,普通,困难),和试题类型数量(单选,多选,判断),以及题库中各种类型的题有多少道,求能否随机抽题。
  • ¥50 rk3588板端推理
  • ¥250 opencv怎么去掉 数字0中间的斜杠。
  • ¥15 这种情况的伯德图和奈奎斯特曲线怎么分析?
  • ¥250 paddleocr带斜线的0很容易识别成9
  • ¥15 电子档案元素采集(tiff及PDF扫描图片)
  • ¥15 flink-sql-connector-rabbitmq使用
  • ¥15 zynq7015,PCIE读写延时偏大