前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LintCode 802. 数独(回溯)/ LeetCode 37. 解数独

LintCode 802. 数独(回溯)/ LeetCode 37. 解数独

作者头像
Michael阿明
发布2020-07-13 16:48:45
6040
发布2020-07-13 16:48:45
举报

1. 题目

编写一个程序,通过填充空单元来解决数独难题。 空单元由数字0表示。 你可以认为只有一个唯一的解决方案。

在这里插入图片描述
在这里插入图片描述

LeetCode 37 题类似,把 int 改成 char,注意转换

2. 解题

  • 行、列、小9宫格内 1-9 都只出现一次
  • 暴力回溯,坐标转换
代码语言:javascript
复制
class Solution {
    vector<vector<int>> ans;
public:
    void solveSudoku(vector<vector<int>> &b) {
        dfs(b,0);
        b = ans;
    }
    
    void dfs(vector<vector<int>> &b, int idx)
    {
        if(idx > 80)
        {
            ans = b;
            return;
        }
        int i = idx/9, j = idx%9;//idx是序号,转换成行列标号
        if(b[i][j] != 0)
            dfs(b,idx+1);//数字是已给的,跳过
        else
        {
            for(int k = 1; k <= 9; ++k)
            {	//遍历9个数字
                if(isok(b,i,j,k))
                {	//数字 k 在当前格子合法
                    b[i][j] = k;
                    dfs(b,idx+1);
                    b[i][j] = 0;
                }
            }
        }
    }
    
    bool isok(vector<vector<int>> &b, int i, int j, int& num)
    {	
        int box_i, box_j;
        box_i = i/3, box_j = j/3;//行列坐标算出小9宫格的坐标
        for(int k = 0; k < 9; ++k)
        {	//遍历9个格子,行的,列的,9 宫格内的,都不能出现过 num
            if(b[i][k]==num || b[k][j]==num || b[box_i*3+k/3][box_j*3+k%3]==num)
                return false;
        }
        return true;
    }
};

100% 数据通过测试 总耗时 273 ms 您的提交打败了 55.71% 的提交!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-03-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档