首页 > 其他分享 >37. 解数独

37. 解数独

时间:2023-04-19 18:11:45浏览次数:29  
标签:return val tuple int 37 ++ board 解数

编写一个程序,通过填充空格来解决数独问题。

数独的解法需 遵循如下规则:

数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 '.' 表示。

> 我的解法

class Solution {
private:
    bool isValid(int tuple,int column,char val,vector<vector<char>>& board){
        //get the top-left location
        int x = tuple - tuple % 3;  
        int y = column - column % 3;
        for(int i = 0;i < 3;i++){
            for(int j = 0;j < 3;j++){
                if(board[x+i][y+j] == val){
                    return false;
                }
            }
        }
        for(int i =0;i < 9;i++){
            if(board[tuple][i] == val){
                return false;
            }
        }
        for(int i =0;i < 9;i++){
            if(board[i][column] == val){
                return false;
            }
        }
        return true;
    }
    bool backtracking(vector<vector<char>>& board) {
        for (int i = 0; i < 9; i++) {        // 遍历行
            for (int j = 0; j < 9; j++) { // 遍历列
                if (board[i][j] != '.') continue;
                    for (char k = '1'; k <= '9'; k++) {     // (i, j) 这个位置放k是否合适
                        if (isValid(i, j, k, board)) {
                            board[i][j] = k;                // 放置k
                            if (backtracking(board)) return true; // 如果找到合适一组立刻返回
                            board[i][j] = '.';              // 回溯,撤销k
                        }
            }
            return false;                           // 9个数都试完了,都不行,那么就返回false
          }
        }
        return true;
    }
public:
    void solveSudoku(vector<vector<char>>& board) {
        backtracking(board);
    }
};

标签:return,val,tuple,int,37,++,board,解数
From: https://www.cnblogs.com/lihaoxiang/p/17334213.html

相关文章

  • 给帮孩子解数学难题的宝爸宝妈们提个醒,希望对为人父母者辅导孩子学习有所帮助。
    现在的数学难题多分步走,千万不要为了节省时间,跳过前面步骤直接解后面的步骤。前面的步骤是为后面的做铺垫的,不是没用可以跳过去的。比如一道解析几何题,第一问是求解析式,第二问问截距,第三问问夹角,这前面的第一步是无法跳过去的,用这个例子一下子就说明白了。大家可以试试看,即使孩子解......
  • hdoj 天气情况 1437 (打表&数学)
    天气情况TimeLimit:2000/1000MS(Java/Others)    MemoryLimit:65536/32768K(Java/Others)TotalSubmission(s):685    AcceptedSubmission(s):280ProblemDescription如果我们把天气分为雨天,阴天和晴天3种,在给定各种天气......
  • vue全家桶进阶之路37:Vue3 状态管理
    Vue3的状态管理主要是通过Vuex4来实现。Vuex是一个专为Vue.js应用程序开发的状态管理模式,它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。在Vue3的状态管理中,以下是各个属性的作用:state:存储应用程序中的状态数据。它可以......
  • vue全家桶进阶之路37:Vue3 路由守卫
    在Vue.js3.x中,我们可以使用路由守卫来拦截路由的跳转,从而实现一些功能,例如:登录验证、页面权限控制等。Vue.js3.x中的路由守卫和Vue.js2.x中的基本相同,都包含了beforeEach、beforeResolve和afterEach等钩子函数。下面是一些常见的路由守卫用法示例:beforeEachbefo......
  • 代码随想录 46天 day198.打家劫舍 | | 337.打家劫舍 III | 213.打家劫舍II
    你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你不触动警报装置的情况下,一夜之内能......
  • 成都控制设备订做:利用74373芯片进行单片机IO口扩展的方法介绍
    本文介绍用74373芯片进行微处理器IO口扩展的方法。1.为什么要进行IO口扩展?在电路设计的某些时候,微处理器(如单片机)IO口不够用了,此时该怎么办呢?利用辅助芯片进行IO口扩展是个简单直接的方法,能用较少的成本增多IO口。我处提供单片机、PLC、电路板、控制器/箱、仪器仪表、机电设备或系......
  • 1378. 使用唯一标识码替换员工ID
    【题目】Employees表:+---------------+---------+|ColumnName  |Type   |+---------------+---------+|id           |int    ||name         |varchar|+---------------+---------+id是这张表的主键。这张表的每一行分别代表了某公......
  • day31| 455+376+53
    455.分发饼干 题目简述:假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干j,都有一个尺寸s[j] 。如果s[j] >=g[i],我们可以将这个饼干j分配给......
  • day30| 332+51+37
    332.重新安排行程题目简述:给你一份航线列表tickets,其中tickets[i]=[fromi,toi]表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。所有这些机票都属于一个从JFK(肯尼迪国际机场)出发的先生,所以该行程必须从JFK开始。如果存在多种有效的行程,请你按字典排序......
  • POJ 2337 Catenyms (欧拉回路+并查集)
    题目地址:POJ2337这题跟POJ1386差不多,只不过这题多一个输出路径而已。按字母来建边,每个单词的首字母和尾字母加边。先判断是否连通,然后判断每个字母的入度和出度不能出现差的绝对值大于2,然后入度和出度差的绝对值为1的不能超过两个。就可以形成欧拉路径代码如下:#include<iostream......