leetcode 93: Sudoku Solver (uncompleted.)

本文介绍了一种使用回溯算法解决数独问题的方法。通过跟踪已填充数字并递归尝试所有可能的数字来填充空格,确保每行、每列及每个宫内的数字都不重复。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Write a program to solve a Sudoku puzzle by filling the empty cells.

Empty cells are indicated by the character '.'.

You may assume that there will be only one unique solution.


A sudoku puzzle...


...and its solution numbers marked in red.

uncompleted.


public class Solution {
        ArrayList<HashSet<Character>> line; 
        ArrayList<HashSet<Character>> col; 
        ArrayList<HashSet<Character>> square;
        int sz;
    
    public void solveSudoku(char[][] board) {
        // Start typing your Java solution below
        // DO NOT write main() function
        sz = board.length;
        
        ArrayList<HashSet<Character>> line = new ArrayList<HashSet<Character>>(); 
        ArrayList<HashSet<Character>> col = new ArrayList<HashSet<Character>>(); 
        ArrayList<HashSet<Character>> square = new ArrayList<HashSet<Character>>();
        
        for(int i=0; i<9; i++) {
            line.add( new HashSet<Character>());
            col.add( new HashSet<Character>());
            square.add( new HashSet<Character>());
        }
        
        int count=0;
        for(int i=0; i<sz; i++) {
            for(int j=0; j<sz; j++) {
                if(board[i][j] != '.') {
                    ++count;
                    line.get(i).add( board[i][j] );
                    col.get(i).add( board[i][j] );
                    square.get((i/3)*3+j%3).add( board[i][j]);
                }    
            }
        }
        
        sudokuRec(board, 0);
    }
    
    private void sudokuRec(char[][] board, int level){
        if(level== sz*sz) {
            return;
        }   
        
        for(int l=level; l<sz*sz;l++) {
            int i=level/sz;
            int j=level%sz;
                if(board[i][j]=='.') {
                    for(char k='1';k<='9';k++){
                        if(!line.get(i).contains(k) && !col.get(j).contains(k) && !square.get((i/3)*3+j%3).contains(k) ){
                            board[i][j]=k;
                            line.get(i).add(k);
                            col.get(j).add(k);
                            square.get((i/3)*3+j/3).add(k);
                            sudokuRec(board,l+1);
                            line.get(i).remove(k);
                            col.get(j).remove(k);
                            square.get((i/3)*3+j/3).remove(k);
                            board[i][j]='.';
                        }
                    }
                } 
        }
    }
}















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值