代码随想录算法训练营第二十六天|leetcode37、51题

一、leetcode第51题

本题将递归与回溯结合,重点在于如何判断该位置能否放置皇后,也就是该位置同一行、同一列、45度对角线和135度对角线是否已经放置了皇后,如果已经放置皇后则该位置不合法。因此,需要在每一行的每一列都试探性地插入皇后,如果合法则进行下一行的皇后插入,否则回溯倒退将皇后插入下一列。

具体代码如下:

cpp 复制代码
class Solution {
public:
    vector<vector<string>>result;
    vector<vector<string>> solveNQueens(int n) {
    vector<string>s(n,string(n,'.'));
    backtracking(n,0,s);
    return result;
    }
    void backtracking(int n,int row,vector<string>&s)
    {
       if(row==n)
       {
        result.push_back(s);
        return;
       }
       for(int col=0;col<n;col++)
       {
        if(isvalid(row,col,s,n))
        {
            s[row][col]='Q';
            backtracking(n,row+1,s);
            s[row][col]='.';
        }
       }
    }
    bool isvalid(int row,int col,vector<string>&s,int n)
    {
        for(int i=0;i<row;i++)
        {
            if(s[i][col]=='Q')
            {
                return false;
            }
        }
        for(int i=row-1,j=col-1;i>=0&&j>=0;i--,j--)
        {
            if(s[i][j]=='Q')
            {
                return false;
            }
        }
        for(int i=row-1,j=col+1;i>=0&&j<n;i--,j++)
        {
            if(s[i][j]=='Q')
            {
                return false;
            }
        }
        return true;
    }
};

二、leetcode第37题

本题比上一题要求要更为复杂,需要在每个位置都插入数字,因此需要进行双层回溯,对数独的每一个空位置都进行判断是否合法,如果合法则添加数字并继续探索下一个位置,如果不合法则需要回溯。

具体代码如下:

cpp 复制代码
class Solution {
public:
    void solveSudoku(vector<vector<char>>& board) {
    backtracking(board);
    }
    bool backtracking(vector<vector<char>>& board)
    {
        for(int i=0;i<board.size();i++)
        {
            for(int j=0;j<board[0].size();j++)
            {
                if(board[i][j]=='.')
                {
                    for(char k='1';k<='9';k++)
                    {
                        if(isvalid(i,j,board,k))
                        {
                            board[i][j]=k;
                            if(backtracking(board)){return true;}
                            board[i][j]='.';
                        }
                    }
                    return false;
                }
            }
        }
        return true;
    }
    bool isvalid(int i,int j,vector<vector<char>>& board,char k)
    {
        for(int a=0;a<9;a++)
        {
            if(board[i][a]==k)
            {
                return false;
            }
        }
        for(int b=0;b<9;b++)
        {
            if(board[b][j]==k)
            {
                return false;
            }
        }
        int starti=(i/3)*3;
        int startj=(j/3)*3;
        for(int i=starti;i<starti+3;i++)
        {
            for(int j=startj;j<startj+3;j++)
            {
                if(board[i][j]==k)
                {
                    return false;
                }
            }
        }
        return true;
    }
};
相关推荐
gfdhy1 天前
【c++】哈希算法深度解析:实现、核心作用与工业级应用
c语言·开发语言·c++·算法·密码学·哈希算法·哈希
百***06011 天前
SpringMVC 请求参数接收
前端·javascript·算法
一个不知名程序员www1 天前
算法学习入门---vector(C++)
c++·算法
云飞云共享云桌面1 天前
无需配置传统电脑——智能装备工厂10个SolidWorks共享一台工作站
运维·服务器·前端·网络·算法·电脑
福尔摩斯张1 天前
《C 语言指针从入门到精通:全面笔记 + 实战习题深度解析》(超详细)
linux·运维·服务器·c语言·开发语言·c++·算法
橘颂TA1 天前
【剑斩OFFER】算法的暴力美学——两整数之和
算法·leetcode·职场和发展
xxxxxxllllllshi1 天前
【LeetCode Hot100----14-贪心算法(01-05),包含多种方法,详细思路与代码,让你一篇文章看懂所有!】
java·数据结构·算法·leetcode·贪心算法
前端小L1 天前
图论专题(二十二):并查集的“逻辑审判”——判断「等式方程的可满足性」
算法·矩阵·深度优先·图论·宽度优先
铁手飞鹰1 天前
二叉树(C语言,手撕)
c语言·数据结构·算法·二叉树·深度优先·广度优先
专业抄代码选手1 天前
【Leetcode】1930. 长度为 3 的不同回文子序列
javascript·算法·面试