leetcode 36~37 解数独

leetcode 36. Valid Sudoku

问题描述

Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules.

The Sudoku board could be partially filled, where empty cells are filled with the character '.'.
sudu
A partially filled sudoku which is valid.
Note:
A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.

问题分析

本问题主要是判断这个数独目前是否符合数独需要的三条规则,即行列,方框内是否是1~9,但是并不需要判断这个数独是否可解。我们可以直接将行列方框内的数分别用hashset存取 如果一旦出现添加某元素已存在的情况直接返回false即可,直到所有都添加完后还是没有冲突则表明当前数独是成立的。

java代码实现

import java.util.HashSet;

/**
 * @Author: LiuYafei
 * @Date: 2017/10/31
 * @Time: 20:38
 * @Description:
 */
public class ValidSudoku {
    public boolean isValidSudoku(char[][] board) {
        for(int i = 0; i < 9; i++ ) {
            HashSet<Character> rows = new HashSet<>();
            HashSet<Character> columns = new HashSet<>();
            HashSet<Character> cube = new HashSet<>();
            for(int j = 0; j < 9; j++ ) {
                if (board[i][j] != '.' && !rows.add(board[i][j])) {
                    return false;
                }
                if (board[j][i] != '.' && !columns.add(board[j][i])) {
                    return false;
                }
                //r和c控制cube的左上角坐标
                int r = 3 * (i / 3);
                int c = 3 * (i % 3);
                if(board[r + j / 3][c + j % 3] != '.' && !cube.add(board[r + j / 3][c + j % 3])) {
                    return false;
                }
            }
        }
        return true;
    }
}

leetcode 37. Sudoku Solver

问题描述

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.
su
A sudoku puzzle...
su

问题分析

这道题在上一题的基础上直接让编写程序来解这个数独,为此我还手工完成了这个数独(原来真的没有玩过几次数独,突然发现数独挺好玩的,可能荒废了好久的数学细胞又在作祟哈哈哈)。解法的话利用回溯法,简称不达到目的不回头,一出现问题就回头。这个算法的重点在于找好回溯点。话不多说看代码。

java代码

public class SudokuSolver {
    public static void solveSudoku(char[][] board) {
        if (board == null || board.length == 0) {
            return;
        }
        solve(board);
    }

    public static boolean solve(char[][] board) {
        for(int i=0; i < board.length; i++) {
            for (int j=0; j< board[0].length;j++) {
                if(board[i][j] == '.') {
                    for(char c = '1'; c <= '9'; c++) {
                        if(isVaild(board, i, j, c)) {
                            board[i][j] = c;
                            if(solve(board)) {
                                return true;

                            }
                            else {
                                board[i][j] = '.';
                            }
                        }
                    }
                    return false;
                }
            }
        }
        return true;
    }

    public static boolean isVaild (char[][] board, int row, int col, char c) {
        for(int i=0;i<9;i++) {
            if(board[i][col] != '.' && board[i][col] == c) {
                return false;
            }
            if(board[row][i] != '.' && board[row][i] == c) {
                return false;
            }
            if(board[3*(row/3) + i/3][3 * (col / 3) + i % 3] != '.' && board[3*(row/3) + i/3][3 * (col / 3) + i % 3] == c) {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        char[][] bo = {
                {'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'}
        };
        SudokuSolver.solveSudoku(bo);
        for(int i=0;i<9;i++) {
            for(int j=0;j<9;j++) {
                System.out.print(bo[i][j] + ",");
            }
            System.out.println();
        }
    }
}

在第一次写的时候出现少一个等号,坑了我好久,最后一步步调试才找到,以后更加认真写判断条件,不能想当然。
数独真的挺好玩的!!!

转载于:https://www.cnblogs.com/lyf722/p/7766855.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值