递归算法学习——N皇后问题,单词搜索

这篇具有很好参考价值的文章主要介绍了递归算法学习——N皇后问题,单词搜索。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

递归算法学习——N皇后问题,单词搜索,算法学习——递归,算法,学习,c++,Cpp,学习笔记,深度优先

目录

​编辑

一,N皇后问题

1.题意

2.解释

3.题目接口

4.解题思路及代码

二,单词搜索

1.题意

2.解释

3.题目接口

4.思路及代码


一,N皇后问题

1.题意

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

2.解释

这道题其实就是在下国际象棋。国际象棋的皇后是可以走上下左右和斜对角六个方向的。所以在放置皇后时我们就要考虑一下在那个位置放入一个皇后我们才不会被攻击。直到将所有能防止皇后的位置放好以后便返回放好皇后以后的棋盘。

3.题目接口

class Solution {
public:
    vector<vector<string>> solveNQueens(int n) {

    }
};

4.解题思路及代码

class Solution {
public:
    vector<vector<string>>ret;//存结果
    vector<string>board;//开棋盘
    bool rowCheak[10];
    bool colCheak[10];
    bool digit1[20];
    bool digit2[20];
    //因为对于一条对角线有row = col+b->row-col = b。但是b在[-n,n]。
    //为了将负数下标去掉所以在左右两边都加上n:row-col+n = b+n->[0,2*n]
    //所以diagonal要开20个空间
    int n;
    vector<vector<string>> solveNQueens(int _n) {
           n = _n;
           board.resize(n);
          for(int i = 0;i<n;i++)
          {
              board[i].append(n,'.');
          }
              
           dfs(0);
           return ret;
    } 

    void dfs(int row)
    {
        if(row == n)
        {
            ret.push_back(board);
            return;
        }

        for(int col = 0;col<n;col++)
        {
            if(board[row][col]=='.'&&!rowCheak[row]&&!colCheak[col]&&!digit1[row-col+n]&&!digit2[row+col])
            {
                board[row][col] = 'Q';
                rowCheak[row]=colCheak[col]=digit1[row-col+n] = digit2[row+col] = true;
                dfs(row+1);
                board[row][col] = '.';
                rowCheak[row]=colCheak[col]=digit1[row-col+n] = digit2[row+col] = false;
            }
        }
    }
};

对于这道题,采用的便是类似于哈希表的解决方法。

1.首先我们得找四个布尔类型的数组:rowCheak,colCheak,digit1,digit2。这四个布尔类型的数组分别标记的是行,列,左对角线,右对角线。

2.然后便是递归的设计了,我们可以采用一个一个的试的方法,但是这样效率太低了。所以我们便采用一行一行试的方法来设计递归函数。

 dfs(0);

首先从第0行开始。每次遍历一行,每次在dfs函数里面遍历每一行的每一列。当对应行列下标的位置不是'Q'并且这一个格子的行,列,对角线都没有被使用过便可以插入Q。然后再遍历下一行,假设这一行填下的皇后会导致得不到结果便要回溯处理。

3.当row越界的时候说明我们的皇后已经填完了,在这个时候便可以返回了。

二,单词搜索

1.题意

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

2.解释

这一道题让我们做的便是在给定一个m*n大小的棋盘并且给定一个单词word的情况下让我们去在这个棋盘里面找到这个单词的每一个字母。并且这个单词的每一个相邻字母在棋盘中还是相邻的。

3.题目接口

class Solution {
public:
    bool exist(vector<vector<char>>& board, string word) {

    }
};

4.思路及代码

1.第一种解法:

class Solution {
public:
    vector<vector<bool>>used;
    int m,n;
    bool exist(vector<vector<char>>& board, string word) {
          m = board.size();
          n = board[0].size();
          used.resize(m);
          for(int i = 0;i<m;i++)
          {
              used[i].resize(n);
          }

          for(int i = 0;i<m;i++)
          {
              for(int j = 0;j<n;j++)
              {     
                    
                   if(dfs(board,i,j,word,0)) return true;//df函数只有在将word的全部字母找到以后才能返回true。
                 
              }
          }

          return false;//全部遍历完了还没有结果便返回false
          
    } 

    bool dfs(vector<vector<char>>& board,int i,int j,string& word,int pos)
    {
          if(i<0||i>=m||j<0||j>=n||used[i][j]||board[i][j]!=word[pos]) //答案不对的情况
          {
              return false;
          }

          if(pos == word.size()-1)//当最后一个字母也被匹配到了便可以返回true
          {
              return true;
          }

          used[i][j] = true;//使用过了便标记一下

          bool res = dfs(board,i,j-1,word,pos+1)||
          dfs(board,i,j+1,word,pos+1)||dfs(board,i-1,j,word,pos+1)
          ||dfs(board,i+1,j,word,pos+1);//在这个位置的上下左右寻找

          used[i][j] = false;//res可能是false所以要恢复现场调整上一层的寻找的下标

          return res;
    }
};

2.第二种解法文章来源地址https://www.toymoban.com/news/detail-703051.html

class Solution {
public:
    vector<vector<bool>>used;
    int m,n;
    bool exist(vector<vector<char>>& board, string word) {
          m = board.size();
          n = board[0].size();
          used.resize(m);
          for(int i = 0;i<m;i++)
          {
              used[i].resize(n);
          }

          for(int i = 0;i<m;i++)
          {
              for(int j = 0;j<n;j++)
              {     
                    
                  if(board[i][j] == word[0])
                  {
                      used[i][j] =true;
                      if(dfs(board,i,j,word,1)) return true;
                      used[i][j] = false;
                  }
                 
              }
          }

          return false;
          
    } 

    bool dfs(vector<vector<char>>& board,int i,int j,string& word,int pos)
    {
    

        if(pos == word.size())
        {
            return true;
        }

        int dx[4] = {0,0,1,-1},dy[4] = {1,-1,0,0};//用数组和for循环来表示上下左右寻找

        for(int k =0;k<4;k++)
        {
            int x = i+dx[k],y = j+dy[k];
            if(x>=0&&x<m&&y>=0&&y<n&&board[x][y] ==word[pos]&&!used[x][y])//只统计对的情况
            {
                used[x][y] = true;
                if(dfs(board,x,y,word,pos+1)) return true;
                used[x][y] = false;
            }
        }

        return false;
    }
};

到了这里,关于递归算法学习——N皇后问题,单词搜索的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法】回溯:与递归,dfs的同质与分别,剪枝与恢复现场的详细理解,n皇后的回溯解法及算法复杂度分析。

    目录 ​编辑 1.什么是回溯 2.关于剪枝 3.关于恢复现场 4.题目:二叉树的所有路径(凸显恢复现场:切实感受回溯与深搜) 问题分析 ①函数设置为:void Dfs(root) ②函数设置为:void Dfs(root,path) 解题思想:使⽤深度优先遍历(DFS)求解。 代码实现 5.N后问题 问题分析 4皇后的放置

    2024年04月16日
    浏览(41)
  • Java每日一练(20230417) N 皇后、搜索二维矩阵、发奖金问题

    目录 1. N 皇后  🌟🌟🌟 2. 搜索二维矩阵  🌟🌟 3. 发奖金问题 🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C++每日一练 专栏 Java每日一练 专栏 n 皇后问题  研究的是如何将  n  个皇后放置在  n×n  的棋盘上,并且使皇后彼此之间不能相互攻

    2024年02月15日
    浏览(43)
  • leetcode做题笔记79单词搜索

    给定一个  m x n  二维字符网格  board  和一个字符串单词  word  。如果  word  存在于网格中,返回  true  ;否则,返回  false  。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不

    2024年02月12日
    浏览(35)
  • 【回溯算法篇】N皇后问题

    🌠 作者:@ 阿亮joy. 🎆 专栏:《数据结构与算法要啸着学》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 n 皇后问题研究的是如何将 n 个皇后放置在 n × n 的棋盘上,并且使皇后彼此之间不能相互攻击。

    2024年01月16日
    浏览(37)
  • DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台、刷题集合、问题为导向的十大类刷题算法(数组和字符串、栈和队列、二叉树、堆实现、图、哈希表、排序和搜索、动态规划/回溯法/递归/贪心/分治)总

    Algorithm:【算法进阶之路】之算法面试刷题集合—数据结构知识和算法刷题及其平台、问题为导向的十大类刷题算法(数组和字符串、链表、栈和队列、二叉树、堆、图、哈希表、排序和搜索、回溯算法、枚举/递归/分治/动态规划/贪心算法)总结 目录 相关文章

    2024年02月08日
    浏览(56)
  • 算法:回溯算法(以解决n皇后问题为例)

    基本思想:回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。八皇后问题就是回溯算法的典型,第一步按照顺序放一个皇后,然后第二步符合要求放第2个皇后,如果没有位置符合要求,那么就要改变第一个皇后的位置,重新放第2个皇后

    2024年02月05日
    浏览(32)
  • 算法leetcode|79. 单词搜索(rust重拳出击)

    给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

    2024年02月09日
    浏览(59)
  • python中级篇1:n皇后问题(回溯算法)

    hello!大家好,我是浪矢秀一。最近经历了许多事情,终于是恢复1次更新了。那么今天呢,我们来学习中级篇,需要学过不少python知识的人来学习。好了,废话不多说,我们进入今天的课程!   在1个n*n的国际象棋棋盘上,放置n个皇后,要求:同1行、同1列、同1斜线上只能有1个皇后。   既然

    2024年02月03日
    浏览(37)
  • 递归、搜索与回溯算法(专题一:递归)

    往期文章(希望小伙伴们在看这篇文章之前,看一下往期文章) (1)递归、搜索与回溯算法(专题零:解释回溯算法中涉及到的名词)【回溯算法入门必看】-CSDN博客 接下来我会用几道题,来让同学们利用我在专题零中提到的 递归的宏观思想 来解决这些题目。 目录 1. 汉诺

    2024年01月25日
    浏览(44)
  • 进阶搜索算法 学习笔记

    DATE 20231031:补充一道好题 P4872 OIer们的东方梦(Dijkstra 分层图最短路)。 双向广搜、双向深搜 堆优化的 Dijkstra 一颗小小的 A-STAR 不大聪明的 IDDFS(IDS) 可爱的 IDA-STAR 这是进阶搜索算法,不说了直接上例题: 以“P1514 引水问题”为例: 点击查看代码 算法思想 在搜索的时候

    2024年02月09日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包