数独问题
来源:互联网 发布:正则表达式匹配端口号 编辑:程序博客网 时间:2024/05/22 13:09
思路
1 对数独求解,即用回溯穷举法。遍历每一个位置,把1-9填入看是否满足。
2 按行遍历,如果这行满了就到下一行。遇到 . 就试着把1-9合适的填进去。接着便利下一个位置。
3 如何判断填入的数字是否合适。可分三种情况,行 列 宫
代码:
void solveSudoku(vector<vector<char> > &board) { if(board.empty() || board.size()!=9 || board[0].size()!=9) return ; solveSuDuDFS(board,0,0); //solveSudokuDFS(board,0,0); } bool solveSuDuDFS(vector<vector<char>>& board,int row,int col){ if(row==9) return true; if(col>=9) return solveSuDuDFS(board,row+1,0); //按行遍历, if(board[row][col]=='.'){ //遇到。才会去试着填数 for(int i=1;i<=9;i++){ board[row][col]=(char)(i+'0'); //把1-9都试这填入 if(isValidSuDu(board,row,col)){ //如果满足就接着去下一个位置 if(solveSuDuDFS(board,row,col+1)) return true; } board[row][col]='.'; //不满足的话回溯到上一步 } }else{ return solveSuDuDFS(board,row,col+1); } return false; } bool isValidSuDu(vector<vector<char>> &board,int row,int col){ for(int i=0;i<9;i++){ if(row!=i&&board[row][col]==board[i][col]){ //判断 每一列 是否有相同的数字 return false; } } for(int i=0;i<9;i++){ if(col!=i&&board[row][col]==board[row][i]) //判断每一行是否有相同的数字 return false; } for(int i=row/3*3;i<row/3*3+3;i++){ for(int j=col/3*3;j<col/3*3+3;j++){ if((row!=i||col!=j)&&board[i][j]==board[row][col]) //判断每一个宫内是否有相同的数字 return false; } } return true; }
延伸:
判断一个数独是否是有效的数独
思路:
用hashset 的 add方法 判重复
代码1 :
public boolean isValidSudoku(char[][] board) { // 每一个大循环确定一行,一列,一个九宫格 for (int i = 0; i < 9; i++) { Set<Character> row = new HashSet<Character>(); Set<Character> col = new HashSet<Character>(); Set<Character> cube = new HashSet<Character>(); for (int j = 0; j < 9; j++) { // 第i行 if (board[i][j] != '.' && !row.add(board[i][j])) return false; // 第i列 if (board[j][i] != '.' && !col.add(board[j][i])) return false; // int cubeRow = 3 * (i / 3) + j / 3, cubeCol = 3 * (i % 3) + j % 3; if (board[cubeRow][cubeCol] != '.' && !cube.add(board[cubeRow][cubeCol])) return false; } } return true; }代码2
bool isValidSudoku(vector<vector<char> > &board) { bool flag=true; for(int i=0;i<9;i++){ for(int j=0;j<9;j++){ char t=board[i][j]; if(t!='.'){ flag=isValid(board,i,j,t); if(!flag) return false; } } } return flag; } bool isValid(vector<vector<char>>& board,int row,int col,char t){ for(int i=0;i<9;i++){ if(i!=row&&board[i][col]==board[row][col]) return false; } for(int i=0;i<9;i++){ if(col!=i&&board[row][col]==board[row][i]) return false; } for(int i=row/3*3;i<row/3*3+3;i++){ for(int j=col/3*3;j<col/3*3+3;j++){ if((i!=row||j!=col)&&board[i][j]==board[row][col]) return false; } } return true; }
阅读全文
0 0
- 数独问题思考
- 数独问题
- cs101,数独问题
- 数独问题
- 4.9 数独问题
- 数独问题
- hdu - 数独问题
- 数独问题
- 算法 数独问题
- 数独问题
- 数独问题
- 数独问题
- 数独问题
- skudo数独问题
- 数独问题
- 数独问题
- 数独问题
- 数独问题
- 第7周项目3-负数把正数赶出队列
- SpringMvc返回页面参数的几种方式
- vue学习01--v-bind:title/v-if/v-for
- ABP官方文档(十八)【领域服务】
- android 基础控件02-ListView
- 数独问题
- 秋招总结---求职攻略
- windows 下 直接启用网络诊断
- 第七周 【项目6
- kmeans算法原理以及实践操作(多种k值确定以及如何选取初始点方法)
- 相对路径和绝对路径
- Android.mk 中的 LOCAL_SRC_FILES, LOCAL_C_INCLUDES
- Android取消SVN版本控制
- linux系统后台运行java程序