sudoku

本文介绍了一种检测数独有效性的方法,通过遍历每一行、每一列和每一个区块来检查是否存在重复数字。同时,还提供了一个使用回溯法解决数独的算法,从第一个空格开始尝试填入1到9的数字,递归地求解剩余部分,直至数独完整或确定无法解决。
1. valid sudoku
就是检测每行,每列,每个block是否有重复数字。
public class Solution {
    public booleanisValidSudoku(char[][] board) {
       // Start typing your Java solution below
       // DO NOT write main() function
       if (board.length != 9 || board[0].length != 9){
           returnfalse;
       }
       
       // row
       for (int i = 0; i < 9; i++){
           int[]array = new int[10];
           for (int j= 0; j < 9; j++) {
              char ch = board[i][j];
              if (ch < '0'|| ch > '9') {
                 continue;
              }
              int num = ch - '0';
              array[num] ++;
              if (array[num]> 1) {
                 return false;
              }
           }
       }

       // column
       for (int j = 0; j < 9; j++){
           int[]array = new int[10];
           for (int i= 0; i < 9; i++) {
              char ch = board[i][j];
              if (ch < '0'|| ch > '9') {
                 continue;
              }
              int num = ch - '0';
              array[num] ++;
              if (array[num]> 1) {
                 return false;
              }
           }
       }
       
       // block
       for (int i = 0; i <= 6; i += 3){
           for (int j= 0; j <= 6; j+=3) {
              int[] array = newint[10];
              for (int row = i; row< i+3; row++) {
                 for (int col = j; col < j+3;col++) {
                     char ch =board[row][col];
                     if (ch< '0' || ch > '9') {
                        continue;
                    
                     int num =ch - '0';
                    array[num]++;
                     if(array[num] > 1) {
                        return false;
                     }
                 }
              }
           }
       }
       return true;
    }
}

sudoku solver
中心思想:找到第一个 .的位置,依次填1-9,然后看看剩下的能否被solve。不能的话此点重置. 
public class Solution {
    public voidsolveSudoku(char[][] board) {
       // Start typing your Java solution below
       // DO NOT write main() function
       solve(board);
    }
    
    private booleansolve(char[][] board) {
       for (int i = 0; i < 9; i++){
           for (int j= 0; j < 9; j++) {
              if (board[i][j] == '.'){
                 for (int k = 1; k <= 9; k++){
                    board[i][j] = (char) ( k + '0');
                     if(isValid(board, i, j) &&solve(board)) {
                        return true;
                     }
                    board[i][j] = '.';
                 }
             return false;
              }
           }
       }
       return true;
    }

    private booleanisValid(char[][] board, int row, int col) {
       HashSet<Character>set = new HashSet<Character>();
       // row
       set.clear();
       for (int j = 0; j < 9; j++){
           char tmp =board[row][j];
           if(set.contains(tmp)) {
              return false;
           }
           if (tmp<= '9' && tmp> '0') {
              set.add(tmp);
           }
       }

       // col
       set.clear();
       for (int i = 0; i < 9; i++){
           char tmp =board[i][col];
           if(set.contains(tmp)) {
              return false;
           }
           if (tmp<= '9' && tmp> '0') {
              set.add(tmp);
           }
       }
       
       // block
       set.clear();
       int startRow = row/3*3;
       int startCol = col/3*3;
       for (int i = startRow; i <startRow+3; i++) {
           for (int j= startCol; j < startCol+3; j++) {
              char tmp = board[i][j];
              if (set.contains(tmp)){
                 return false;
              }
              if (tmp <= '9'&& tmp > '0'){
                 set.add(tmp);
              }
           }
       }
       return true;
    }
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值