【ACWING】【BFS】【844走迷宫】【845八数码】

news2024/11/17 16:02:33

一、走迷宫

给定一个 n×m的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1,其中 0表示可以走的路,1 表示不可通过的墙壁。

最初,有一个人位于左上角 (1,1)处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。

请问,该人从左上角移动至右下角 (n,m)处,至少需要移动多少次。

数据保证 (1,1)处和 (n,m)处的数字为 0,且一定至少存在一条通路。

输入格式

第一行包含两个整数 n和 m。
接下来 n行,每行包含 m 个整数(0 或 1),表示完整的二维数组迷宫。

输出格式

输出一个整数,表示从左上角移动至右下角的最少移动次数。

数据范围

1≤n,m≤100

输入样例:

5 5
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0

输出样例:

8

#include<iostream>
#include<vector>
#include<queue>
#include <utility>
#include<limits.h>
using namespace std;
struct board_node{
    board_node(int n,int m,int step)
    {
        this->n=n;
        this->m=m;
        this->step=step;
    }
    int n;
    int m;
    int step;
};
int main()
{
    int n,m;
    cin>>n>>m;
    vector<vector<int>> board;
    vector<vector<int>> record(n,vector<int>(m,false));
    int x=0;
    while(x++<n)
    {
        vector<int> row;
        int y=0;
        while(y++<m)
        {
            int num=0;
            cin>>num;
            row.push_back(num);
        }
        board.push_back(row);
    }
    vector<pair<int,int>> direction{{0,1},{0,-1},{1,0},{-1,0}};
    queue<board_node> path;
    board_node start(0,0,0);
    path.push(start);
    record[0][0]=1;
    int minstep=INT_MAX;
    while(!path.empty())
    {
        board_node a =path.front();
        path.pop();
        if(a.n==n-1&&a.m==m-1)
        {
            minstep=min(minstep,a.step);
        }
        else {
            for(int i=0;i<4;i++)
            {
            if((a.n+direction[i].first>=0)&&(a.n+direction[i].first<n)&&(a.m+direction[i].second>=0)&&(a.m+direction[i].second<m)
                &&(board[a.n+direction[i].first][a.m+direction[i].second]==0)&&record[a.n+direction[i].first][a.m+direction[i].second]==0) {
                    board_node tmp(a.n + direction[i].first, a.m + direction[i].second, a.step + 1);
                    record[a.n+direction[i].first][a.m+direction[i].second]=1;
                    path.push(tmp);
                }
            }
        }
    }
    cout<<minstep<<endl;
    return 0;
}

二、八数码

在一个 3×3的网格中,1∼8这 8个数字和一个 x 恰好不重不漏地分布在这 3×3的网格中。

例如:

1 2 3
x 4 6
7 5 8
在游戏过程中,可以把 x 与其上、下、左、右四个方向之一的数字交换(如果存在)。

我们的目的是通过交换,使得网格变为如下排列(称为正确排列):

1 2 3
4 5 6
7 8 x
例如,示例中图形就可以通过让 x 先后与右、下、右三个方向的数字交换成功得到正确排列。

交换过程如下:

在这里插入图片描述

现在,给你一个初始网格,请你求出得到正确排列至少需要进行多少次交换。

输入格式

输入占一行,将 3×3的初始网格描绘出来。

例如,如果初始网格如下所示:

1 2 3
x 4 6
7 5 8
则输入为:1 2 3 x 4 6 7 5 8

输出格式

输出占一行,包含一个整数,表示最少交换次数。
如果不存在解决方案,则输出 −1。

输入样例:

2 3 4 1 5 x 7 6 8

输出样例

19

这里我们就可以将我们的每一步的九宫格都看成一种状态,然后将这种状态保存到一个map
中,看看有没有遍历过。然后当前这种状态我们可以用一个字符串去表示。每一次我们从队列的队首出一个字符串,然后我们将这个字符串中的x跟上下左右分别进行交换,看交换之后我们的字符串是否合法,合法的话我们就将其放入我们的队列中。直到我们从队列队首的字符串等于我们的目标字符串为止。

#include<iostream>
#include<string>
#include<queue>
#include<map>
#include<utility>
using namespace std;
int main()
{
    map<string,int> record;
    string begin;
    string end="12345678x";
    for(int i=0;i<9;i++){
        char num;
        cin>>num;
        begin+=num;
    }
    record[begin]=1;
    vector<pair<int,int>> direction{{1,0},{-1,0},{0,1},{0,-1}};
    queue<pair<string,int>> path;
    path.push({begin,0});
    while(!path.empty())
    {
        string tmp=path.front().first;
        int count=path.front().second;
        path.pop();
        if(tmp==end)
        {
            cout<<count<<endl;
            return 0;
        }
        int position=tmp.find('x');
        int x=position/3;
        int y=position%3;
        for(int i=0;i<4;i++)
        {
            int x1=x+direction[i].first;
            int y1=y+direction[i].second;

            if(x1>=0&&x1<3&&y1>=0&&y1<3)
            {
                swap(tmp[position],tmp[x1*3+y1]);
                if(!record.count(tmp))
                {
                    record[tmp]=1;
                    path.push({tmp, count + 1});
                }
                swap(tmp[position],tmp[x1*3+y1]);
            }

        }
    }
    cout<<-1<<endl;
    return 0;
}

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

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

相关文章

CVE复现1

1 CVE-2022-22980 spring Data MongoDB SpEL 表达式注入,Spring Data MongoDB应用程序在对包含查询参数占位符的SpEL表达式使用Query或Aggregation注解的查询方法进行值绑定时&#xff0c;如果输入未被过滤&#xff0c;则容易受到SpEL注入攻击。 影响范围 Spring Data Mongo…

190:vue+openlayers 调整卫星运动的播放速度,展示运动轨迹

第190个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers项目中利用两行根数计算卫星在某一时刻的位置点,利用时间循环,定位出不同的位置,呈现动画的效果。文中利用slider的改变来确定当前时间为开始时间,slider的值为加速倍数,每个setTimeout为10毫秒,更新…

【博客系统】前端页面

博客系统 实现一个简单的博客系统。 当前先完成页面设计部分&#xff0c;通过学习的前端知识来构建出网页。 主要分成四个部分&#xff1a; 博客列表页博客正文页博客登陆页博客编辑页 预期效果 博客列表页效果 博客详情页效果 博客登陆页效果 博客编辑页效果 实现博客列…

C++数据结构--跳表的思想--手把手教你实现跳表--0721

1、 跳表--skiplist skiplist本质上是一种查找结构&#xff0c;跟平衡搜索树和哈希表的价值是一样的。跳表首先是一个链表&#xff0c;它是在链表的基础上发展的。但一般的链表进行查找数据只能全部遍历&#xff0c;时间复杂度为O(n)。 William Pugh的优化&#xff1a; 假如每…

Kafka一次线上问题

线上问题&#xff1a; Kafka: 客户说Broker不时会发生些错误日志&#xff0c;也看到topic的tps下降很快很明显&#xff0c; 日志看是ISR在不断的伸缩&#xff0c; 监控发现发生问题时的CPU、IO、磁盘都没有瓶颈 再查看堆栈信息&#xff1a;可看到关键信息&#xff1a; 有锁…

R语言raster包批量读取单一或大量栅格图像

本文介绍基于R语言中的raster包&#xff0c;读取单张或批量读取多张栅格图像&#xff0c;并对栅格图像数据加以基本处理的方法。 1 包的安装与导入 首先&#xff0c;我们需要配置好对应的R语言包&#xff1b;前面也提到&#xff0c;我们这里选择基于raster包来实现栅格图像数据…

TestStand-单执行界面

文章目录用户界面运行流程例程创建前面板设置用户界面主窗口前面板控件配置用户事件用户界面运行流程 用户界面设计的基本元素&#xff1a;管理控件、可视化控件、连接、应用程序启动及关闭、注册事件、处理事件。 LabVIEW中通过Regesiter Event Callback注册事件。 LabVIEW-Te…

flink内存管理, 增加Task内存大小,减少ManageMemory, network内存的方法

问题描述 flink默认分配的内存&#xff0c;不合理&#xff0c;jvm 堆内存太小&#xff0c;其他内存太大。向yarn申请8G内存&#xff0c;最后分配到heap的大小才3.2G&#xff0c;不是让人抓狂吗&#xff1f; 以上是&#xff0c;向yarn申请8G内存&#xff0c;实时分配的内存是上…

“破壁者”氚云,打破低代码之困

互联网云大厂的“火”已经烧红了低代码领域的半边天。 自低代码在国内盛行以来&#xff0c;尤其是时至2022年末&#xff0c;阿里、腾讯、华为等云大厂的跑马圈地仍如火如荼&#xff0c;动作密集程度堪比机关枪。 面对日益增长的企业数字化业务需求&#xff0c;产品经理只需少…

编译器设计(十三)——指令调度

一、简介 对程序块或过程中的操作进行排序以有效利用处理器资源的任务称为指令调度&#xff08;instruction scheduling&#xff09;。调度器的输入是由目标机汇编语言操作组成的一个部分有序的列表&#xff0c;输出是同一列表的一个有序版本。 一组指令的执行时间严重依赖于…

什么是云存储?有什么优势?

在云计算中&#xff0c;用户将数据保存在远程位置。它可以通过互联网连接访问&#xff0c;而不是在本地或物理上(在硬盘上)访问。而云存储成为最实用有效的方式之一。它有助于在线存储数据。 什么是云存储? 云存储是指安全、全局和可扩展的数据存储。它用于存储不可变数据&…

智慧工厂的大脑——APS生产排程系统

生产计划排程是生产管理中的核心工作&#xff0c;或许很多人不同意这个观点&#xff0c;只是因为这个观点的前提是生产计划排程在生产管理中真正起到了作用&#xff0c;目前国内制造业的现状还不能体现出生产计划排程的真正作用&#xff0c;所以也没有人认为它是最核心的工作&a…

蓝桥杯Python练习题11-闰年判断

资源限制   内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述   给定一个年份&#xff0c;判断这一年是不是闰年。 当以下情况之一满足时&#xff0c;这一年是闰年&#xff1a;   1. 年…

“集合划分问题”如何解决?这里教你个妙招,轻松掌握这类问题~

目录 “集合划分”这类问题的解题思路 一、划分为k个相等的子集 二、火柴拼正方形 “集合划分”这类问题的解题思路 这类题一般都会描述成这个样子&#xff1a;“给你一个数组&#xff0c;是否能将他划分成n个数值相等的子集&#xff1f;”&#xff0c;再或者有些可能题目描述…

MinIO高性能对象存储

一、MinIO高性能对象存储 MinIO是一个高性能对象存储解决方案&#xff0c;它提供了与Amazon Web Services S3兼容的API&#xff0c;并支持所有核心S3功能。 MinIO旨在部署任何地方—公共或私有云、裸机基础设施、协调环境和边缘基础设施。本文档说的是Windows平台上MinIO部署的…

接口测试自动化框架选型

1、fiddler fiddler 是一个 HTTP 协议调试代理工具&#xff0c;Web 和手机测试都会用到&#xff0c;同时也支持接口测试。它能够记录并检查所有你的电脑和互联网之间的 http 通讯&#xff0c;设置断点&#xff0c;查看所有的“进出”Fiddler 的数据(指 cookie,html,js,css 等文…

ASP.NET大型药品销售ERP系统源码

ASP.NET医药ERP管理系统源码 药品销售管理系统源码 源码分享&#xff01;需要源码学习可私信我。 一、源码特点 1、渠道销售商在把药品从厂商销售到医院时&#xff0c;需要管理大量的数据&#xff0c;这些通常包括药品从厂商采购数据、药品销售到商业公司的数据&#xff0c;以…

Python文件基础操作(6)

python学习之旅(六) &#x1f44d;基础语法部分笔记(一) &#x1f44d;条件判断部分笔记(二) &#x1f44d;循环语句部分笔记(三) &#x1f44d;函数使用部分笔记(四) &#x1f44d;数据容器部分笔记(五) &#x1f44d;文件操作部分笔记(六) 一.文件编码 编码就是一种规则集合&…

数据湖---hudi核心概念

文章目录TimelineTable & Query TypesTable Types查询类型COWMOR索引Hudi索引类型索引选择策略File Layouts元数据表元数据表的动机研究中的一些数字&#xff1a;支持多模态索引写操作操作类型UPSERTINSERTBULK_INSERTDELETE写入路径schema 演进key生成并发控制Datasource …

强强联合,怿星科技艾拉比携手斩获“铃轩奖”

12月23日—24日&#xff0c;汽车行业的年度盛典2022中国汽车供应链峰会&#xff08;CASCS2022&#xff09;盛大开幕&#xff0c;全国汽车供应链大咖再次聚首中国车谷&#xff0c;怿星科技CEO潘凯在圆桌《新汽车软件到底怎么办》上分享了观点。会议同期&#xff0c;国内最具权威…