//编写一个程序,通过填充空格来解决数独问题。 // // 数独的解法需 遵循如下规则: // // // 数字 1-9 在每一行只能出现一次。 // 数字 1-9 在每一列只能出现一次。 // 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) // // // 数独部分空格内已填入了数字,空白格用 '.' 表示。 // // // // // // // 示例: // // //输入:board = [["5","3",".",".","7",".",".",".","."],["6",".",".","1","9","5","." //,".","."],[".","9","8",".",".",".",".","6","."],["8",".",".",".","6",".",".","." //,"3"],["4",".",".","8",".","3",".",".","1"],["7",".",".",".","2",".",".",".","6" //],[".","6",".",".",".",".","2","8","."],[".",".",".","4","1","9",".",".","5"],[" //.",".",".",".","8",".",".","7","9"]] //输出:[["5","3","4","6","7","8","9","1","2"],["6","7","2","1","9","5","3","4","8" //],["1","9","8","3","4","2","5","6","7"],["8","5","9","7","6","1","4","2","3"],[" //4","2","6","8","5","3","7","9","1"],["7","1","3","9","2","4","8","5","6"],["9"," //6","1","5","3","7","2","8","4"],["2","8","7","4","1","9","6","3","5"],["3","4"," //5","2","8","6","1","7","9"]] //解释:输入的数独如上图所示,唯一有效的解决方案如下所示: // // // // // // // 提示: // // // board.length == 9 // board[i].length == 9 // board[i][j] 是一位数字或者 '.' // 题目数据 保证 输入数独仅有一个解 // // // // // Related Topics 数组 回溯 矩阵 // 👍 885 👎 0 //leetcode submit region begin(Prohibit modification and deletion) class Solution { //定义x行,数字n-1是否被占用 boolean[][] row = new boolean[9][9]; //定义y行,数字n-1是否被占用 boolean[][] colume = new boolean[9][9]; //定义x/3,y/3 单元块中数字n-1是否被占用 boolean[][][] cell = new boolean[3][3][9]; public void solveSudoku(char[][] board) { //初始化已知数据 for(int x=0;x<9;x++){ for(int y=0;y<9;y++){ if(board[x][y]!='.'){ int num = (int)board[x][y]-'1'; row[x][num]=true; colume[y][num]=true; cell[x/3][y/3][num]=true; } } } dsf(board,0,0); } Boolean dsf(char[][] board,int x,int y){ //设置结束条件 //如果最后一行执行完毕,返回成功 if(x==9){return true;} //如果最后一列执行完毕,继续下一行开始位置 if(y==9){return dsf(board,x+1,0);} //如果该位置有值,换下一位置填充 if(board[x][y]!='.'){ return dsf(board,x,y+1); } //尝试填入1-9数字 for(int i=0;i<9;i++){ //如果填入数字满足三个条件 及(该行该列该单元没有这个值则可以填入) if(!row[x][i]&&!colume[y][i]&&!cell[x/3][y/3][i]){ board[x][y] =(char)(i+'1'); row[x][i]=true; colume[y][i]=true; cell[x/3][y/3][i]=true; //如果后续位置填入成功,则该位置填入的值为正确值 if(dsf(board,x,y+1)){ break; }else{ //不合理的值,将记录中的值去掉; board[x][y] = '.'; row[x][i]=false; colume[y][i]=false; cell[x/3][y/3][i]=false; } } } //尝试填入1-9后,如果填入成功,则返回成功,否则失败 return board[x][y] != '.'; } } //leetcode submit region end(Prohibit modification and deletion)
填充数独算法
最新推荐文章于 2023-01-13 12:00:45 发布