Sudoku Solver

本文介绍了一种通过编程解决数独谜题的方法,包括使用回溯算法填充空格,确保唯一解决方案的实现。重点阐述了终止条件、递归调用与有效性检查等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.


A sudoku puzzle...


...and its solution numbers marked in red.

backtracking... 基本套路,一个一个试,不对的话回溯充填。。。。这个题有递归的有循环的。。。我觉得都挺好。。。。要注意两个地方:

1. 终止条件是如果col=9那么就要round 一次, 到row+1, 0 去

2. 用1-9来尝试,要首先填进去然后再递归。。。OJ编译器好像有问题?我在线下是先判断再填再递归也能过。。。如果填入有效那么判断下一步,否则回溯。

class Solution {
public:
    void solveSudoku(vector<vector<char> > &board) {
        solver(board,0,0);
    }
    
    bool solver(vector< vector<char> >& tbl, int i, int j){
      
        if (j==9)
            return solver(tbl,i+1,0);
        if (i==9)
            return true;
        if (tbl[i][j]=='.'){
           for (char k='1'; k<='9'; k++){
               tbl[i][j]=k;
              if (isValid(tbl,i,j) && solver(tbl,i,j+1))
                return true;
               tbl[i][j]='.';
           }
        } else {
            return solver(tbl, i,j+1);
        }
        return false;
    }
    // check if assign c to tbl[i][j] is valid
    bool isValid(const vector< vector<char> >& tbl, int i, int j){
        // check row and col
        for (int k=0; k<9; k++){
            if ( k!=j && tbl[i][k]==tbl[i][j])
                return false;
            if (k!=i && tbl[k][j]==tbl[i][j])
                return false;
        }
       // check small 9 blocks
       for (int a=i/3*3; a<i/3*3+3; a++){
           for (int b=j/3*3; b<j/3*3+3; b++){
               if (a!=i && b!=j && tbl[a][b]==tbl[i][j])
                return false;
           }
       }
       return true;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值