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

news2024/11/25 8:16:49

目录

​编辑

一,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.第二种解法

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;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/979037.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里云服务器怎么退款?云服务器退款流程图

阿里云服务器如何退款&#xff1f;云服务器在哪申请退款&#xff1f;在用户中心订单管理中的退订管理中退款&#xff0c;阿里云百科分享阿里云服务器退款流程&#xff0c;包括申请退款入口、云服务器退款限制条件、退款多久到账等详细说明&#xff1a; 目录 阿里云服务器退款…

I/O系统:I/O设备,I/O接口,I/O端口的编址,I/O指令、通道指令,I/O控制方式 ,补充:中断

I/O&#xff1a;Input / Output&#xff0c;即输入/输出。 I/O系统一般由I/O硬件&#xff08;I/O设备&#xff0c;I/O接口&#xff0c;I/O总线等&#xff09;和I/O软件&#xff08;驱动程序&#xff0c;用户程序&#xff0c;管理程序&#xff0c;升级补丁等&#xff09;构成。…

基于sd的模特换装

这个领域的核心就是怎么把商品展示出来&#xff0c;商品本身不能发生变化&#xff0c;细节不能乱&#xff0c;模特换装或者虚拟换装&#xff0c;核心不在人&#xff0c;而在于商品&#xff0c;阿里塔玑这种核心在于怎么把平面的2D商品转成一个3D商品图&#xff0c;怎么让模特把…

蒙特卡洛方法使用原理解系-单位圆的面积计算

简介 蒙特卡洛也成为统计模拟方法&#xff0c;提出以概率统计理论为指导的一类非常重要的数值计算方法&#xff0c;是指使用随机数&#xff08;或者更常见的伪随机数&#xff09;来解决很多计算问题的方法。蒙特卡罗方法的名字来源于摩纳哥的一个城市蒙特卡罗&#xff0c;该城…

IIO驱动 Industrial I/O(正点原子笔记)

最近看见很多iio 驱动adc&#xff0c;赶紧找来学习一下。 传感器内部都会有ADC&#xff0c;传感器对外提供 IIC或者 SPI 接口&#xff0c;SOC 可以通过 IIC 或者 SPI 接口来获取到传感器内部的 ADC 数值&#xff0c;从而得到想要测量的结果。Linux 内核为了管理这些日益增多的…

恒运资本:港股内房股拉升 融创中国、中国恒大涨超30%

截至发稿&#xff0c;融创我国、我国恒大涨超30%&#xff0c;把戏年控股、天誉置业涨超20%。 9月6日&#xff0c;港股内地房地产板块拉升&#xff0c;截至发稿&#xff0c;融创我国、我国恒大涨超30%&#xff0c;把戏年控股、天誉置业涨超20%&#xff0c;佳兆业集团、富力地产…

springboot实战(六)之mybatis-plus代码自动生成器【重要】

目录 环境&#xff1a; 步骤&#xff1a; 1.添加依赖 2.配置代码 3.运行 测试 1.测试生成的service 1.1、service用法 2.分页查询 2.1、分页插件配置 2.2、测试 3.源码 环境&#xff1a; jdk:1.8 springboot版本&#xff1a;2.7.15 mybatis-plus版本&#xff1…

单片机-蜂鸣器

简介 蜂鸣器是一种一体化结构的电子讯响器&#xff0c;采用直流电压供电 蜂鸣器主要分为 压电式蜂鸣器 和 电磁式蜂鸣器 两 种类型。 压电式蜂鸣器 主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。多谐振荡器由晶体管或集成电路构成&#xff0c;当接通电源后&…

Object —— Guide Deform

使用动画skin驱动引导线&#xff1b;&#xff1b;内嵌Guid Deform节点&#xff1b;

Django创建应用、ORM的进阶使用及模型类数据库迁移

1 Django项目创建第一个应用 Django 项目就是基于 Django 框架开发的 Web 应用&#xff0c;它包含了一组配置和多个应用&#xff0c;我们把应用称之为 App&#xff0c;在前文中对它也做了相应的介绍&#xff0c;比如 auth、admin&#xff0c;它们都属于 APP。 一个 App 就是一…

2023高教社杯国赛ABCDE题免费思路预定(MathClub网站汇聚市面的所有资源,注册即送)

目录 引言A题&#xff1a;[题目名称]概述参考思路参考资源 B题&#xff1a;[题目名称]概述参考思路参考资源 结论 作者&#xff1a;MathClub 日期&#xff1a;2023年9月6日 引言 2023年全国大学生数学建模竞赛&#xff08;高教社杯&#xff09;即将来临&#xff0c;对于众多数…

ChatGPT:深度学习和机器学习的知识桥梁(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

nodejs+vue+elementui精品课程网站设计

前端技术&#xff1a;nodejsvueelementui基于nodejs语言、vue.js框架、B/S架构、Mysql数据库设计并实现了精品课程网站设计。系统主要包括首页、个人中心、用户管理、课程信息管理、课程分类管理、学习论坛、在线试题管理、试题管理、系统管理、考试管理等功能模块。 本文首先介…

tf和pytorch每轮epoch显示输出的auc是如何计算的

tf和pytorch每轮epoch显示输出的auc是如何计算的&#xff1f; tf的计算 近似 ROC 或 PR 曲线的 AUC&#xff08;曲线下面积&#xff09;。 tf1 通过计算真阳性&#xff0c;假阳性&#xff0c;假阴性&#xff0c;真阴性值的计算策略。 tensorflow AUC & streaming_auc_我…

浅谈Spring

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器&#xff08;框架&#xff09;。 一、什么是IOC&#xff1f; IoC Inversion of Control 翻译成中⽂是“控制反转”的意思&#xff0c;也就是说 Spring 是⼀个“控制反转”的容器。 1.1控制反转推导 这个控制反转怎…

PHP教学质量评估系统Dreamweaver开发mysql数据库web结构php编程计算机网页代码

一、源码特点 PHP教学质量评估系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 代码 https://download.csdn.net/download/qq_41221322/88301983 论文 https://down…

【简单几何】CF Edu11 D

Problem - D - Codeforces 题意&#xff1a; 思路&#xff1a; 和蓝桥杯国赛有道题类似&#xff0c;都是用中点来确定图形防止精度缺失 应该算是典 Code&#xff1a; #include <bits/stdc.h>using i64 long long;constexpr int N 2e3 10; constexpr int M 1e6 1…

stm32(GD32,apm32),开优化后需要特别注意的地方

提到优化就不得不提及 volatile 使用场景 1&#xff1a;中断服务程序中修改的供其它程序检测的变量&#xff0c;需要加volatile&#xff1b; : 2&#xff1a;多任务环境下各任务间共享的标志&#xff0c;应该加volatile&#xff1b; 3&#xff1a;并行设备的硬件寄存器&#x…

干货|数学建模必考的四大模型

数学建模国赛即将开始&#xff0c;小编总结近五年的数学建模ABC题题型&#xff0c;并根据题型总结建模常用的四大模型&#xff0c;如下&#xff1a; A题 一般A题偏物理方面&#xff0c;专业性更强&#xff0c;偏难&#xff0c;新手不建议选择A题&#xff0c;原因在于可能看不…

【ccf-csp题解】第1次csp认证-第四题-无线网络-题解

题目描述 思路讲解 可以把题目抽象为&#xff1a;从第1个点到第2个点&#xff0c;经过特殊点的数量不超过k的单源最短路径&#xff08;其中每条边的权重均为1&#xff09; 可以使用bfs解决这个问题&#xff0c;但是dist[][]数组和队列中放置的pair<int,int>元素不再是单…