37. 解数独
题目:编写一个程序,通过填充空格来解决数独问题。
一个数独的解法需遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
空白格用 '.' 表示。
提示:
给定的数独序列只包含数字 1-9 和字符 '.' 。
你可以假设给定的数独只有唯一解。
给定数独永远是 9x9 形式的。
代码: //卡住我两天,最开始每次board数组放入'k',以为放入了字符'1',结果把字符k放进去了,难怪每次都是错误,同时字符和数值转换也没学好 '0' == 48
class Solution {
public void solveSudoku(char[][] board) {
boolean b= backTrack(board,0,0);
}
public static boolean backTrack(char[][] board,int row,int col) { //回溯方法,每次都是放入一个位置
if(col9){row+=1;col=0;}
if(row9){
return true;
}
if(board[row][col]=='.'){
for(int k=1;k<=9;k++){
board[row][col]= (char)(k + '0'); //卡住我两天,最开始放入'k',以为放入了字符'1',结果把字符k放进去了,难怪每次都是错误,同时字符和数值转换也没学好
if(isOk(board,row,col)){
if(backTrack(board,row,col+1)){return true;}
}
board[row][col]='.';
}
return false;
}
return backTrack(board,row,col+1);
}
public static boolean isOk(char[][] board,int row,int col) { //新放入的位置是i,j处,只检查这一处
for(int i=0,j=0;i<9&&j<9;i++,j++){ //判断同行或同列
if(i!=row){
if(board[i][col]==board[row][col]){return false;}
}
if(j!=col){
if(board[row][j]==board[row][col]){return false;}
}
}
//判断9宫格
int i=row/3*3; //元素所在行列的左上角元素行列下标
int j=col/3*3;
while(true){
if(i!=row||j!=col){
if(board[i][j]==board[row][col]){return false;}
}
j++;
if(j==col/3*3+3){
j=col/3*3;
i++;
}
if(i==row/3*3+3){break;}
}
return true;
}
}
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术