shudu

数独(一)

半城伤御伤魂 提交于 2021-02-12 09:05:32
Github地址: https://github.com/cfafa2018/SudokuProject 思路: 根据题目要求,摘取出一些需要解决的问题,差不多也就是整体的解题思路。 代码分成了两大块,生成数独和解数独部分,还有一些小的函数。 (1)命令行中使用 -c和-s,识别并根据命令生成或读取相应的文件。     用ofstream和C语言里面的fopen。对于-c和-s以及一些错误的输入,例如:-c ab 进行处理,提示 Wrong input。利用main函数里的argc和argv两个参数解决。 (2)生成数独。     根据要求,数独左上角的第一个数应该为 (0 + 8)% 9 + 1 = 9,后面8个位置用剩下的8个数进行全排列。然后下面的8行可以分别通过第一行右移得到。(借鉴了同学的思路)这里采用C++实现。 1 if (AllisNum(argv[ 2 ])){ 2 int shudu[ 9 ][ 9 ]={ 0 },arr[]={ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 }; 3 shudu[ 0 ][ 0 ] = 9 ; // 数独第一个数字为9 4 for ( int i = 0 ; i < atoi(argv[ 2 ]); i ++ ){ 5 next_permutation(arr, arr+ 8 ); 6 for ( int j =

【LeetCode】 61 有效的数独

冷暖自知 提交于 2020-08-12 20:12:12
题目: 解题思路: https://leetcode-cn.com/problems/valid-sudoku/solution/zi-yong-you-xiao-de-shu-du-by-agasar/ 代码: class Solution { public boolean isValidSudoku(char[][] board) { int[][] rows = new int[9][9]; int[][] cols = new int[9][9]; int[][] cells = new int[9][9]; for(int i=0; i<board.length; i++){ for(int j=0; j<board[i].length; j++){ if(board[i][j]!='.'){ int num = board[i][j]-'0'; if(rows[i][num-1]==1)return false; rows[i][num-1]++; if(cols[j][num-1]==1)return false; cols[j][num-1]++; int cell = (i/3) * 3 + (j/3); if(cells[cell][num-1]==1)return false; cells[cell][num-1]++; } } } return true;

【LeetCode】 62 解数独

安稳与你 提交于 2020-08-10 17:06:05
题目: 解题思路: 回溯法解数独 类似人的思考方式去尝试,行,列,还有 3*3 的方格内数字是 1~9 不能重复。 我们尝试填充,如果发现重复了,那么擦除重新进行新一轮的尝试,直到把整个数组填充完成。 https://leetcode-cn.com/problems/sudoku-solver/solution/hui-su-fa-jie-shu-du-by-i_use_python/ 代码: class Solution { public void solveSudoku(char[][] board) { // 三个布尔数组 表明 行, 列, 还有 3*3 的方格的数字是否被使用过 boolean[][] rowUsed = new boolean[9][10]; boolean[][] colUsed = new boolean[9][10]; boolean[][][] boxUsed = new boolean[3][3][10]; // 初始化 for(int row = 0; row < board.length; row++){ for(int col = 0; col < board[0].length; col++) { int num = board[row][col] - '0'; if(1 <= num && num <= 9){ rowUsed[row]