zoukankan      html  css  js  c++  java
  • [leetcode]Sudoku Solver

    DFS。这种思路清晰的题目,大问题一般出在小地方。

    1.当DFS找到时,要返回true。这样一路true上去,否则最后格子又会被设为'.';

    2.计算格子所在九宫格时,要用int a = x/3*3+i; 忘记乘3了,一直错;

    public class Solution {
        public void solveSudoku(char[][] board) {
            // Start typing your Java solution below
            // DO NOT write main() function
            int m = board.length;
            if (m == 0) return;
            int n = board[0].length;
            if (n == 0) return;       
            
            ArrayList<Point> arr = new ArrayList<Point>();
            
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    if (board[i][j] == '.') {
                        Point p = new Point();
                        p.x = i;
                        p.y = j;
                        arr.add(p);
                    }
                }
            }
            
            dfs(board, arr, 0);
        }
            
        boolean dfs(char[][] board, ArrayList<Point> arr, int k) {
            if (k == arr.size()) {
                return true;
            }
            else {
                for (int d = 0; d < 9; d++) {
                    Point p = arr.get(k);
                    board[p.x][p.y] = (char)(d + '1');
                    // check valid
                    if (IsValid(board, p.x, p.y) && dfs(board, arr, k+1))
                    {
                        return true;
                    }
                    board[p.x][p.y] = '.';                    
                }
            }
            return false;
        }
        
        private boolean IsValid(char[][] board, int x, int y) {
            int len = board.length;
            char c = board[x][y];
            for (int i = 0; i < len; i++) {
                if (x != i && board[i][y] == c) {
                    return false;
                }
            }
            
            for (int i = 0; i < len; i++) {
                if (y != i && board[x][i] == c) {
                    return false;
                }
            }
            
            for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 3; j++) {
                    int a = x/3*3+i;
                    int b = y/3*3+j;
                    if ((a != x) && (b != y) && board[a][b] == c) {
                        return false;
                    }
                }
            }
            return true;
        }
    }
    
    class Point {
        public int x;
        public int y;
    }
    

      

  • 相关阅读:
    第十周课程总结
    第九周课程总结&实验报告(七)
    第八周课程总结&实验报告(六)
    第七周课程总结&实验报告(五)
    第六周&java实验报告四
    第五周课程总结&试验报告(三)
    课程总结
    第十四周课程总结
    第十三周学习总结
    第十二周编程总结
  • 原文地址:https://www.cnblogs.com/lautsie/p/3244724.html
Copyright © 2011-2022 走看看