搜索算法(DFS和BFS 蓝桥杯 C++)

news2024/12/28 21:43:03

目录

题目一(N皇后问题): 

代码:

 题目二(路径之谜):

代码:

 题目三(最大数字):

代码:

题目四(长草):

代码:

 题目五(走迷宫):

代码:

 题目六(迷宫):

​代码:

题目一(N皇后问题): 

代码:

#include<iostream>
using namespace std;
int ans = 0;
int n;
int a[20] = { 0 };
int judge(int k)
{
    for (int i = 1; i < k; i++)//从第一行到第k-1行上有无与第k行第a[k]列冲突的皇后
    {
        if ((abs(k - i) == abs(a[k] - a[i])) || (a[k] == a[i]))//斜线和同一列
            return 0;//同一斜线说明斜率为1或者-1,则x1-x2/y1-y2=1,即x1-x2=y1-y2
    }
    return 1;
}

int check(int a)
{
    if (a > n)
        ans++;
    else
        return 0;
    return 1;
}

void dfs(int k)
{
    if (check(k))
        return;
    else
    {
        for (int i = 1; i <= n; i++)
        {
            a[k] = i;//第k个皇后放的列数
            if (judge(k))//判断第k个皇后是否可放在a[k]该列
                dfs(k + 1);//可放,进行下一个皇后位置
            else
                continue;//不可放,则下一列
        }
    }
}
int main()
{
    cin >> n;
    dfs(1);//从第一个皇后开始放
    cout << ans << endl;
}

 题目二(路径之谜):

代码:

#include<iostream>
#include<vector>
using namespace std;
int rol[25], col[25];
int n;
int book[25][25];//标记是否走过
int dx[4] = { 0,1,-1,0 };
int dy[4] = { 1,0,0,-1 };
typedef struct node
{
    int a, b;
}node;
vector <node> res;
int check(int x, int y)
{
    if (x == n && y == n)//走到终点
    {
        for (int i = 1; i <= n; i++)
        {
            if (col[i] != 0 || rol[i] != 0)//有一个箭靶上面还有箭,则说明不符合
                return 0;
        }
        for (int i = 0; i < res.size(); i++)//箭靶都拔光了,符合
        {
            int tx = res[i].a;
            int ty = res[i].b;
            int sum = n * (tx - 1) + ty - 1;//算出第几格,输出
            cout << sum << " ";
        }
        return 0;
    }
    return 1;//没走到终点,继续走
}
void dfs(int x, int y)
{
    if (!check(x, y))//判断是否继续往下走
        return;
    else
    {
        for (int i = 0; i < 4; i++)//朝四个方向走
        {
            int tx = dx[i] + x;
            int ty = dy[i] + y;
            if (book[tx][ty] == 1 || tx<1 || tx>n || ty<1 || ty>n || col[tx] <= 0 || rol[ty] <= 0)//走过或者走出边界或者箭靶上的箭数量不够(等于0也不行,是因为在之前已经判断还没走到终点,如果箭的数量等于0,也意味着不可以走到这)
                continue;
            else
            {
                book[tx][ty] = 1;//标记该点走过
                col[tx]--, rol[ty]--;//靶子上的数减1
                res.push_back({ tx,ty });//走过的存下
                dfs(tx, ty);//从tx,ty往下走递归
                res.pop_back();//恢复
                book[tx][ty] = 0;
                col[tx]++;
                rol[ty]++;
            }
        }
    }
}
int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> rol[i];
    for (int i = 1; i <= n; i++)
        cin >> col[i];
    book[1][1] = 1;
    rol[1]--, col[1]--;
    res.push_back({ 1,1 });
    dfs(1, 1);
    //cout << 1;
}

 题目三(最大数字):

代码:

#include<iostream>
using namespace std;
string s;
long long ans = 0;
int n, m;
void dfs(int i, long long sum)
{
    int x = s[i] - '0';//第i位数
    if (s[i])//有该位数
    {
        int t = min(n, 9 - x);//看操作数一的次数够不够满足该位加到9
        n -= t;
        dfs(i + 1, sum * 10 + x + t);
        n += t;//回溯
        if (m >= x + 1)//对于操作数二,只有够让该位减为9,才能使其变大
        {
            m -= x + 1;
            dfs(i + 1, sum * 10 + 9);
            m += x + 1;//回溯
        }
    }
    else
        ans = max(ans, sum);//取最大值
}
int main()
{
    cin >> s;
    cin >> n >> m;
    dfs(0, 0);
    cout << ans;
}

题目四(长草):

代码:

#include<iostream>
#include<queue>
using namespace std;
int n, m, k;
char s[1010][1010];
int dx[4] = { 1,0,0,-1 };
int dy[4] = { 0,1,-1,0 };
int len;
typedef struct node
{
    int x, y;
}node;
queue<node> q;
void bfs()
{
    while (!q.empty()&&k>0)
    {
        int x = q.front().x ;
        int y = q.front().y ;
        q.pop();
        for (int i = 0; i < 4; i++)//四个方向
        {
            int tx = x + dx[i];
            int ty = y + dy[i];
            if (tx < 1 || tx>n || ty < 1 || ty>m || s[tx][ty]=='g')
                continue;
            else 
            {
                s[tx][ty] = 'g';
                q.push({ tx, ty });
            }
        }
        len--;//每取一块地,则len--
        if (len == 0)//len等于0则表明,该月都长完了
        {
            k--;//则k--
            len = q.size();//再取该月有多少地要向周围生长
        }
    }
}
int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
        {
            cin >> s[i][j];
            if (s[i][j] == 'g')
            {
                q.push({ i,j });//是草的入队
            }
        }
    cin >> k;
    len = q.size();//初始一共有几块地为草
    bfs();
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            cout << s[i][j];
        }
        cout << endl;
    }
}

 题目五(走迷宫):

代码:

#include<iostream>
#include<queue>
using namespace std;
int n, m, k;
int s[110][110];
int book[110][110] = { 0 };
int dx[4] = { 1,0,0,-1 };
int dy[4] = { 0,1,-1,0 };
int flag = 0;//标志是否能走通迷宫
typedef struct node
{
    int x, y, s;
}node;
node start, end1;
queue<node> q;
int check(int x, int y)//检查是否到达出口
{
    if (x == end1.x && y == end1.y)
        return 1;
    return 0;
}
void bfs()
{
    while (!q.empty())
    {
        int x = q.front().x;//取x坐标
        int y = q.front().y;//取y坐标
        int step = q.front().s;//取步数
        q.pop();
        if (check(x,y))//检查是否到达出口
        {
            cout << step;
            flag = 1;//标记走出迷宫
            return;
        }
        for (int i = 0; i < 4; i++)//遍历四个方向
        {
            int tx = x + dx[i];
            int ty = y + dy[i];
            if (tx<1 || ty<1 || tx>n || ty>m || book[tx][ty]==1 ||s[tx][ty]==0)//是否越界,是否走过,是否可走
                continue;
            else
            {
                book[tx][ty] = 1;
                q.push({ tx,ty,step+1 });
            }
        }
    }
}
int main()
{
    cin >> n >> m;
    for(int i=1;i<=n;i++)
        for (int j = 1; j <= m; j++)
        {
            cin >> s[i][j];
        }
    cin >> start.x >> start.y >> end1.x >> end1.y;
    q.push({ start.x,start.y,0 });
    bfs();
    if (flag == 0)
        cout << "-1";
}

 题目六(迷宫):

 代码:

#include<iostream>
#include<queue>
using namespace std;
string s[100] = { "01010101001011001001010110010110100100001000101010",
           "00001000100000101010010000100000001001100110100101",
           "01111011010010001000001101001011100011000000010000",
           "01000000001010100011010000101000001010101011001011",
           "00011111000000101000010010100010100000101100000000",
           "11001000110101000010101100011010011010101011110111",
           "00011011010101001001001010000001000101001110000000",
           "10100000101000100110101010111110011000010000111010",
           "00111000001010100001100010000001000101001100001001",
           "11000110100001110010001001010101010101010001101000",
           "00010000100100000101001010101110100010101010000101",
           "11100100101001001000010000010101010100100100010100",
           "00000010000000101011001111010001100000101010100011",
           "10101010011100001000011000010110011110110100001000",
           "10101010100001101010100101000010100000111011101001",
           "10000000101100010000101100101101001011100000000100",
           "10101001000000010100100001000100000100011110101001",
           "00101001010101101001010100011010101101110000110101",
           "11001010000100001100000010100101000001000111000010",
           "00001000110000110101101000000100101001001000011101",
           "10100101000101000000001110110010110101101010100001",
           "00101000010000110101010000100010001001000100010101",
           "10100001000110010001000010101001010101011111010010",
           "00000100101000000110010100101001000001000000000010",
           "11010000001001110111001001000011101001011011101000",
           "00000110100010001000100000001000011101000000110011",
           "10101000101000100010001111100010101001010000001000",
           "10000010100101001010110000000100101010001011101000",
           "00111100001000010000000110111000000001000000001011",
           "10000001100111010111010001000110111010101101111000" };
int n, m, k;
int book[110][110] = { 0 };
int dx[4] = { 1,0,0,-1 };
int dy[4] = { 0,-1,1,0 };
string dt[4] = { "D","L","R","U" };//按字典序排序
typedef struct node
{
    int x, y;
    string t;
}node;
node start, end1;
queue<node> q;
int check(int x, int y)//检查是否到达出口
{
    if (x == end1.x && y == end1.y)
        return 1;
    return 0;
}
void bfs()
{
    while (!q.empty())
    {
        int x = q.front().x;//取x坐标
        int y = q.front().y;//取y坐标
        string t = q.front().t;//取步骤
        q.pop();
        if (check(x, y))//检查是否到达出口
        {
            cout << t;
            return;
        }
        for (int i = 0; i < 4; i++)//遍历四个方向
        {
            int tx = x + dx[i];
            int ty = y + dy[i];
            string tt = t + dt[i];
            if (tx<0 || ty<0 || tx>29 || ty>49)//是否越界
                continue;
            else if(book[tx][ty]==0&&s[tx][ty]=='0')
            {
                book[tx][ty] = 1;
                q.push({ tx,ty,tt });
            }
        }
    }
}
int main()
{
    start.x = 0, start.y = 0, end1.x = 29, end1.y = 49;
    q.push({ 0,0 ,"" });
    bfs();
}

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

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

相关文章

极简技术 | 能够很方便地解决教学中的实际问题

如今&#xff0c;极简教育技术开始兴盛&#xff0c;作为一种能够很方便地解决教学中的实际问题技术体系&#xff0c;“极简主义”与“教育技术”又能碰撞出什么样的火花呢&#xff1f; 一、教育要“技术化”&#xff0c;也可以“极简化” “极简主义”是一种生活理念或哲学&a…

深入理解Docker

文章目录 1 Docker理论1.1 背景知识1.2 是什么1.3 Docker基本三要素1.4 镜像原理1.5 安装教程 2 Docker常用命令2.0 防火墙相关命令2.1 镜像命令2.2 容器命令2.3 进阶命令 3. 实战之Docker部署springboot项目步骤一&#xff1a;Springboot项目配置1.1 添加docker的maven依赖1.2…

spring boot概述

SpringBoot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。 该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。 通过这种方式&#xff0c;SpringBoot致力于在蓬勃发展的快速应用开发…

“祖传代码“的是是非非

程序员眼中的“祖传代码”&#xff0c;就像一本古老而神秘的魔法书&#xff0c;藏着无穷的智慧和技巧&#xff0c;有些代码像家传宝贝&#xff0c;有些像祖传秘方。快来分享一下你遇到的“祖传代码”吧~ 祖传代码的历史与文化价值 祖传代码通常指的是经过长时间使用和传承的代…

Linux操作系统——进程信号

1.信号的概念 生活当中哪些场景算信号呢&#xff1f;比如说你晚上调了个闹钟&#xff0c;然后第二天早上你听到了闹钟响了你就知道该起床了&#xff0c;这种机制就叫做信号机制。在生活中我们的信号是非常非常多的&#xff0c;比如说有&#xff1a;红绿灯&#xff0c;下课铃声…

网络编程作业day3

项目作业1&#xff1a;TCP机械臂测试 客户端操作代码&#xff1a; /*机械臂客户端控制代码*/ #include <myhead.h>#define SER_IP "192.168.125.176" //机械臂服务器IP地址 #define SER_PORT 8888 //机械臂服务器端口号 #define CLI_IP "…

代码随想录算法训练营第35天 | 435. 无重叠区间 ,763.划分字母区间 , 56. 合并区间

贪心算法章节理论基础&#xff1a; https://programmercarl.com/%E8%B4%AA%E5%BF%83%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 435. 无重叠区间 题目链接&#xff1a;https://leetcode.cn/problems/non-overlapping-intervals/ 思路&#xff1a; 相信…

理疗美容按摩小程序有哪些功能

医疗、美容和按摩等行业是一个快速发展的领域&#xff0c;很多美容院和理疗中心都希望通过小程序来提升服务质量和用户体验。下面我们来看看一个理疗美容小程序可以具备哪些功能&#xff0c;并介绍如何使用这些功能。 1. **在线预约服务**&#xff1a;用户可以通过小程序预约理…

第8章:Nginx与Web应用《Nginx实战:从入门到精通》

Nginx不仅仅是一个高效的静态内容服务器和反向代理服务器&#xff0c;它还能与各种流行的Web应用框架和语言环境无缝集成&#xff0c;从而提供强大的动态内容处理能力。在本章中&#xff0c;我们将深入探讨Nginx如何与PHP、Python、Ruby和Node.js等常见的Web应用和语言环境协同…

爬虫入门到精通_实战篇10(使用Redis+Flask维护动态代理池)

1 目标 为什么要用代理池 许多网站有专门的反爬虫措施&#xff0c;可能遇到封IP等问题。互联网上公开了大量免费代理&#xff0c;利用好资源。通过定时的检测维护同样可以得到多个可用代理。 代理池的要求 多站抓取&#xff0c;异步检测定时筛选&#xff0c;持续更新提供接…

【大厂AI课学习笔记NO.56】(9)模型评测

作者简介&#xff1a;giszz&#xff0c;腾讯云人工智能从业者TCA认证&#xff0c;信息系统项目管理师。 博客地址&#xff1a;https://giszz.blog.csdn.net 声明&#xff1a;本学习笔记来自腾讯云人工智能课程&#xff0c;叠加作者查阅的背景资料、延伸阅读信息&#xff0c;及学…

数字化转型导师坚鹏:BLM金融机构数字化转型战略工作坊

BLM金融机构数字化转型战略工作坊 ——以BLM模型为核心&#xff0c;实现知行果合一 课程背景&#xff1a; 很多金融机构存在以下问题&#xff1a; 不知道如何系统地制定金融机构数字化转型战略&#xff1f; 不清楚其它金融机构数字化转型战略是如何制定的&#xff1f; …

动态IP代理技术在网络爬虫中的实际使用

目录 前言 一、什么是动态IP代理技术&#xff1f; 二、动态IP代理技术的实际使用 1. 获取代理IP地址 2. 在网络爬虫中设置代理 3. 周期性更换代理 结论 前言 网络爬虫是一种通过自动化程序从互联网上获取数据的技术。然而&#xff0c;由于某些网站对爬虫进行限制&#…

No matching version found for @babel/traverse@^7.24.0.

问题&#xff1a; npm安装 依赖失败&#xff0c;找不到所需依赖。 原因&#xff1a; npm镜像源中没有该依赖。&#xff08;大概率是因为依赖最近刚更新&#xff0c;当前镜像源没有同步&#xff09; 解决&#xff1a; 查看自己的npm镜像&#xff1a;npm config get registry…

史上最细,企业性能测试步骤详细,测试老鸟带你一篇打通!

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、性能测试流程 …

nodejs,JSDOM 补 window环境

window[atob] 是一个在浏览器中使用的 JavaScript 函数&#xff0c;用于将 base64 编码的字符串解码为原始数据。具体来说&#xff0c;atob 函数会将 base64 字符串解码为一个 DOMString&#xff0c;其中包含解码后的二进制数据。这在处理从服务器获取的 base64 编码的数据或在…

[Vulnhub]靶场 Red

kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 …

带你从Spark官网啃透Spark Structured Streaming

By 远方时光原创&#xff0c;可转载&#xff0c;open 合作微信公众号&#xff1a;大数据左右手 本文是基于spark官网结构化流解读 Structured Streaming Programming Guide - Spark 3.5.1 Documentation (apache.org) spark官网对结构化流解释 我浓缩了一些关键信息&#xff…

LCR 134. Pow(x, n)

解题思路&#xff1a; 分治 快速幂 Java中向下取整n/2即可 需要结合下图理解&#xff0c;算法就是实现的该过程 class Solution {public double myPow(double x, int n) {if(x 0.0f) return 0.0d;long b n;double res 1.0;//例如:2^-5(1/2)^5if(b < 0) {x 1 / x;b -b…

嵌入式中很多MCU公司,为什么都是仿STM32?

做了单片机开发十多年了&#xff0c;STM32是我用过的单片机里面&#xff0c;最省心的。 用STM32做过的产品&#xff0c;至少10几个以上了。 其实不仅仅是STM32&#xff0c;还有STM8系列&#xff0c;也很稳。 我们无际单片机特训营好几个项目&#xff0c;都用了STM8和STM32系…