LeetCode037 Sudoku Solver
来源:互联网 发布:手机版淘宝怎么开店 编辑:程序博客网 时间:2024/06/14 12:27
详细见:leetcode.com/problems/sudoku-solver
Java Solution: github
package leetcode;/* * 解数独 * 方法应该是试凑和回溯 */public class P037_SudokuSolver {public static void main(String[] args) {}/* * 还有很多bug */static class Solution {private boolean[][] isValidRow = new boolean[9][9];private boolean[][] isValidColumn = new boolean[9][9];private boolean[][] isValidNine = new boolean[9][9];private boolean isSuccess = false;public void solveSudoku(char[][] board) {for (int i = 0; i < 9; i++)for (int j = 0; j < 9; j++)if (board[i][j] != '.')init(board, i, j);solve(board, 0, 0);}private void solve(char[][] board, int i, int j) {if (true == isSuccess)return;if (i > 8) {isSuccess = true;return;}if (board[i][j] != '.') {if (j < 8)solve(board, i, j + 1);elsesolve(board, i + 1, 0);if (isSuccess)return;} else {int temp = i / 3 * 3 + j / 3;for (int n = 0; n < 9; n++) {if (!isValidColumn[j][n] && !isValidRow[i][n] && !isValidNine[temp][n]) {board[i][j] = (char) (n + '1');isValidColumn[j][n] = isValidRow[i][n] = isValidNine[temp][n] = true;if (j < 8)solve(board, i, j + 1);elsesolve(board, i + 1, 0);isValidColumn[j][n] = isValidRow[i][n] = isValidNine[temp][n] = false;if (isSuccess)return;}}}}private void init(char[][] board, int i, int j) {isValidRow[i][board[i][j] - '1'] = true;isValidColumn[j][board[i][j] - '1'] = true;isValidNine[i / 3 * 3 + j / 3][board[i][j] - '1'] = true;}}/* * 36 ms * 18.91% */static class Solution2 {public void solveSudoku(char[][] board) {solveSudoku2(board);}public boolean solveSudoku2(char[][] board) {for (int i = 0; i < 9; ++i)for (int j = 0; j < 9; ++j) {if (board[i][j] == '.') {for (int k = 0; k < 9; ++k) {board[i][j] = (char) ('1' + k);if (isValid(board, i, j) && solveSudoku2(board))return true;board[i][j] = '.';}return false;}}return true;}private boolean isValid(char[][] board, int x, int y) {int i, j;for (i = 0; i < 9; i++)if (i != x && board[i][y] == board[x][y])return false;for (j = 0; j < 9; j++)if (j != y && board[x][j] == board[x][y])return false;for (i = 3 * (x / 3); i < 3 * (x / 3 + 1); i++)for (j = 3 * (y / 3); j < 3 * (y / 3 + 1); j++)if ((i != x || j != y) && board[i][j] == board[x][y])return false;return true;}}}
C Solution: github
/* url: leetcode.com/problems/sudoku-solver/ 19ms 11.43%*/#include <stdio.h>#include <stdlib.h>#define bool intint isValid(char** b, int x, int y) {int i = 0, j = 0, k = 0; for (k = 0; k < 9; k ++) { if (k != x && b[k][y] == b[x][y])return 0; if (k != y && b[x][k] == b[x][y])return 0; i = (x / 3) * 3 + k / 3; j = (y / 3) * 3 + k % 3; if ((i != x || j != y) && b[i][j] == b[x][y]) return 0; }return 1;}bool solveSudoku2(char** b) { int i = 0, j = 0, k = 0;for (i = 0; i < 9; ++i)for (j = 0; j < 9; ++j) {if (b[i][j] != '.') continue;for (k = 0; k < 9; ++k) {b[i][j] = (char) ('1' + k);if (isValid(b, i, j) && solveSudoku2(b))return 1;b[i][j] = '.';}return 0;}return 1;}void solveSudoku(char** b, int rs, int cs) { int val = solveSudoku2(b); printf("answer is %d\r\n", val);}char* setChar(char* src, int n) { int i = 0; char* dst = (char*)malloc(sizeof(char) * (n + 1)); for (i = 0; i <= n; i ++) *(dst + i) = *(src + i); return dst;}int main() { char** b = (char **) malloc(sizeof(char *) * 9); char* t = NULL, * tt = NULL; int rs = 9, cs = 9, i = 0, j = 0; b[0] = setChar("..9748...", 9); b[1] = setChar("7........", 9); b[2] = setChar(".2.1.9...", 9); b[3] = setChar("..7...24.", 9); b[4] = setChar(".64.1.59.", 9); b[5] = setChar(".98...3..", 9); b[6] = setChar("...8.3.2.", 9); b[7] = setChar("........6", 9); b[8] = setChar("...2759..", 9); solveSudoku(b, rs, cs); for (i = 0; i < 9; i ++) { for (j = 0; j < 9; j ++) { printf("%c ", b[i][j]); } printf("\r\n"); } for (i = 0; i < 9; i ++) free(*(b + i)); free(b); return 0;}
Python Solution: github
#coding=utf-8''' url: leetcode.com/problems/sudoku-solver/ @author: zxwtry @email: zxwtry@qq.com @date: 2017年4月5日 @details: Solution: 1709ms 12.51%'''from jinja2._compat import unichrclass Solution(object): def isValid(self, b, x, y): x_base, y_base = (x // 3) * 3, (y // 3) * 3 for k in range(9): if x != k and b[x][y]==b[k][y]: return False if y != k and b[x][y]==b[x][k]: return False new_x, new_y = x_base+(k // 3), y_base+(k % 3) if new_x != x and new_y != y and b[x][y] == b[new_x][new_y]: return False return True def solve(self, b): for x in range(9): for y in range(9): if b[x][y] != '.':continue for k in range(9): b[x][y]=unichr(ord('1')+k) if self.isValid(b, x, y)\ and self.solve(b): return True b[x][y] = '.' return False return True def solveSudoku(self, b): """ :type b: List[List[str]] :rtype: void Do not return anything, modify b in-place instead. """ self.solve(b)if __name__ == "__main__": b=[list("..9748..."),\ list("7........"),\ list(".2.1.9..."),\ list("..7...24."),\ list(".64.1.59."),\ list(".98...3.."),\ list("...8.3.2."),\ list("........6"),\ list("...2759..")] Solution().solve(b) print(b)
0 0
- leetcode037:Sudoku Solver
- LeetCode037 Sudoku Solver
- Sudoku Solver
- Sudoku Solver
- Sudoku Solver
- Sudoku Solver
- Sudoku Solver
- Sudoku Solver
- Sudoku Solver
- Sudoku Solver
- Sudoku Solver
- Sudoku Solver
- Sudoku Solver
- Sudoku Solver
- Sudoku Solver
- Sudoku Solver
- Sudoku Solver
- Sudoku Solver
- .text .global _start和_start:是什么意思?
- Centos安装tomcat并且部署项目
- HttpClient发送http请求以及上传文件
- Android Studio2.3.1查看gradle版本
- 路由器逆向分析------QEMU的基本使用方法(MIPS)
- LeetCode037 Sudoku Solver
- C#多线程编程
- springmvc时间类型提交转换的问题
- Python 文件基本操作
- matlab中的Sobel算子C程序源码
- Liunx下的Oracle备份
- [c++基础] 四种类型转换和隐式类型转换
- LeetCode039 Combination Sum
- java读取文件内容几种方式