Leecode 37. 解数独 dfs+回溯

news/2024/7/20 20:29:35 标签: c++, leetcode, dfs, 深度优先

原题链接:Leecode 37. 解数独
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
巧用pair<int,int>存储空格的位置:

解法一:数组存储

class Solution {
public:
    int row[10][10];//行
    int col[10][10];//列
    int box[10][10];//宫
    vector<pair<int, int>> t;
    bool valid=false;
    void dfs(vector<vector<char>>& board,int num)
    {
        if(num==t.size())
        {
            valid=true;
            return ;
        }
        int i=t[num].first;
        int j=t[num].second;
        for(int k=1;k<=9;k++)
        {
            if(!valid)
            {
                int index=(j/3)*3+i/3; 
                if(!row[i][k] && !col[j][k] && !box[index][k])
                {
                    row[i][k]=col[j][k]=box[index][k]=1;
                    board[i][j]=k+'0';
                    dfs(board,num+1);
                    row[i][k]=col[j][k]=box[index][k]=0;
                }
            }
        }
    }
    void solveSudoku(vector<vector<char>>& board) {
        int sum=0;
        for(int i=0;i<9;i++)
        {
            for(int j=0;j<9;j++)
            {
                int index=(j/3)*3+i/3; //该数在哪一个宫中
                if(board[i][j]=='.')
                {
                    t.push_back({i,j});
                }
                else 
                {
                    int tmp=board[i][j]-'0';
                    row[i][tmp]=1;
                    col[j][tmp]=1;
                    box[index][tmp]=1;
                }
            }
        }
        dfs(board,0);
    }
};

解法二:位运算

class Solution {
public:
    int row[10];//行
    int col[10];//列
    int box[10];//宫
    vector<pair<int, int>> t;
    bool valid=false;
    void dfs(vector<vector<char>>& board,int num)
    {
        if(num==t.size())
        {
            valid=true;
            return ;
        }
        int i=t[num].first;
        int j=t[num].second;
        for(int k=1;k<=9;k++)
        {
            if(!valid)
            {
                int index=(j/3)*3+i/3; 
                if(!((row[i]>>k)&1) && !((col[j]>>k)&1) && !((box[index]>>k)&1))
                {
                    row[i]|=(1<<k);
                    col[j]|=(1<<k);
                    box[index]|=(1<<k);
                    board[i][j]=k+'0';
                    dfs(board,num+1);
                    row[i]&=~(1<<k);
                    col[j]&=~(1<<k);
                    box[index]&=~(1<<k);
                }
            }
        }
    }
    void solveSudoku(vector<vector<char>>& board) {
        int sum=0;
        for(int i=0;i<9;i++)
        {
            for(int j=0;j<9;j++)
            {
                int index=(j/3)*3+i/3; //该数在哪一个宫中
                if(board[i][j]=='.')
                {
                    t.push_back({i,j});
                }
                else 
                {
                    int tmp=board[i][j]-'0';
                    row[i]|=(1<<tmp);
                    col[j]|=(1<<tmp);
                    box[index]|=(1<<tmp);
                }
            }
        }
        dfs(board,0);
    }
};

http://www.niftyadmin.cn/n/1265013.html

相关文章

Leecode 38. 外观数列 字符串

原题链接&#xff1a;Leecode 38. 外观数列 class Solution { public:string a[31];string fun(string s){int n1;string res"";int i1;for(;i<s.size();i){if(s[i]s[i-1])n;else {res(n0);ress[i-1];n1;}}res(n0);ress[i-1];return res;}string countAndSay(i…

(Leetcode) 有效的括号 - Python实现

题目&#xff1a; 有效的括号: 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串&#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 …

Leecode 39. 组合总和 dfs+回溯+剪枝

原题链接&#xff1a;Leecode 39. 组合总和 dfs回溯剪枝 class Solution { public:vector<int> tmp;vector<vector<int>> res;void dfs(vector<int>& candidates, int target,int now){if(target0){res.push_back(tmp);return ;}if(target<c…

链表Linked List

为什么需要链表 顺序表的构建需要预先知道数据大小来申请连续的存储空间&#xff0c;而在进行扩充时又需要进行数据的搬迁&#xff0c;所以使用起来并不是很灵活。 链表结构可以充分利用计算机内存空间&#xff0c;实现灵活的内存动态管理。 链表的定义 链表&#xff08;Li…

leecode 40. 组合总和 II dfs+回溯+剪枝+去重

原题链接&#xff1a;leecode 40. 组合总和 II 去重这一句很巧妙&#xff1a;if(i>now && candidates[i]candidates[i-1])&#xff0c;这句规定了在同一层次上&#xff0c;相同的数只能选一次。 class Solution { public:vector<vector<int>> res;ve…

栈 Stack

栈 栈&#xff08;stack&#xff09;&#xff0c;有些地方称为堆栈&#xff0c;是一种容器&#xff0c;可存入数据元素、访问元素、删除元素&#xff0c;它的特点在于只能允许在容器的一端&#xff08;称为栈顶端指标&#xff0c;英语&#xff1a;top&#xff09;进行加入数据…

队列 Queue

队列 定义 队列&#xff08;queue&#xff09;是只允许在一端进行插入操作&#xff0c;而在另一端进行删除操作的线性表。 队列是一种**先进先出的&#xff08;First In First Out&#xff09;**的线性表&#xff0c;简称FIFO。允许插入的一端为队尾&#xff0c;允许删除的一…

排序 Sorting

定义 排序算法&#xff08;英语&#xff1a;Sorting algorithm&#xff09;是一种能将一串数据依照特定顺序进行排列的一种算法。 排序算法的稳定性 稳定性&#xff1a;稳定排序算法会让原本有相等键值的纪录维持相对次序。也就是如果一个排序算法是稳定的&#xff0c;当有两…