备战蓝桥杯---搜索(应用入门)

话不多说,直接看题:

显然,我们可以用BFS,其中,对于判重操作,我们可以把这矩阵化成字符串的形式再用map去存,用a数组去重现字符串(相当于map映射的反向操作)。移动空格先找到x的位置再推算出在矩阵里的位置进行移动即可。

至于如何回溯,我们创造last数组来看它上一个是谁,用form数组记录变化的操作。

然后dfs回溯输出即可。

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
#define N 363000
int last[N],cnt;
int form[N];
char dd;
map<string,int> mp;
string a[N],s1,s2="12345678x";
queue<int> q;
int dir[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
char ck[4]={'r','l','u','d'};
int bfs(string s1,string s2){
    mp[s1]=1;
    cnt=1;
    last[cnt]=0;
    a[cnt]=s1;
    q.push(cnt);
    while(!q.empty()){
        int tmp=q.front();
        q.pop();
        int tt=a[tmp].find('x');
        int x=tt/3,y=tt%3;
        for(int i=0;i<4;i++){
            string nxt=a[tmp];
            int x1=x+dir[i][0];
            int y1=y+dir[i][1];
            if(x1<0||x1>=3||y1<0||y1>=3) continue;
            swap(nxt[tt],nxt[x1*3+y1]);
            if(mp.find(nxt)!=mp.end()) continue;
            mp[nxt]=++cnt;
            last[cnt]=tmp;
            form[cnt]=i;
            a[cnt]=nxt;
            q.push(cnt);
            if(nxt==s2) return 1;
        }
    }
    return 0;
}
void dfs(int cnt){
    if(cnt==1) return;
    dfs(last[cnt]);
    cout<<ck[form[cnt]];
}
int main(){
    for(int i=1;i<=9;i++){
        cin>>dd;
        s1+=dd;
    }
    if(bfs(s1,s2)==0) cout<<"unsolvable";
    else dfs(mp[s2]);
}

注意:方向数组中(1,0)是down(因为这wa了好久)

下面来一道刚刚比赛过的题:

这名字显然是个坑,看到数据范围就知道要暴力了3^10是可以接受的,于是我们用dfs写

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,t,a[20],min1=20;
struct node{
    int u,v;
}q[20];
void deal(){
    int cnt=1;
    for(int i=2;i<=n;i++){
        if(a[i]>a[1]) cnt++;
    }
    min1=min(min1,cnt);
}
void dfs(int x){
    if(x>m){
         deal();
        return ;
    }
    for(int i=1;i<=3;i++){
        if(i==1){
            a[q[x].u]+=3;
            dfs(x+1);
            a[q[x].u]-=3;
        }
        else if(i==2){
            a[q[x].v]+=3;
            dfs(x+1);
            a[q[x].v]-=3;
        }
        else{
            a[q[x].u]+=1;
            a[q[x].v]+=1;
            dfs(x+1);
            a[q[x].u]-=1;
            a[q[x].v]-=1;
        }
    }
    return ;
}
int main(){
    cin>>t;
    while(t--){
        cin>>n>>m;
        for(int i=1;i<=n;i++) cin>>a[i];
        for(int i=1;i<=m;i++) cin>>q[i].u>>q[i].v;
        dfs(1);
        cout<<min1<<endl;
        min1=20;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣热门100题刷题笔记 - 3.无重复字符的最长子串

力扣热门100题 - 3.无重复字符的最长子串 题目链接&#xff1a;3. 无重复字符的最长子串 题目描述&#xff1a; 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。示例&#xff1a; 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字…

EasyCVR视频融合平台如何助力执法记录仪高效使用

旭帆科技的EasyCVR平台可接入的设备除了常见的智能分析网关与摄像头以外 &#xff0c;还可通过GB28181协议接入执法记录仪&#xff0c;实现对执法过程的全称监控与录像&#xff0c;并对执法轨迹与路径进行调阅回看。那么&#xff0c;如何做到执法记录仪高效使用呢&#xff1f; …

【Linux Day15 TCP网络通讯】

TCP网络通讯 TCP编程流程 接口介绍 socket()方法是用来创建一个套接字&#xff0c;有了套接字就可以通过网络进行数据的收发。创建套接字时要指定使用的服务类型&#xff0c;使用 TCP 协议选择流式服务&#xff08;SOCK_STREAM&#xff09;。 **bind()方法是用来指定套接字使…

STM32L4学习

STM32L4系列是围绕Cortex-M4构建&#xff0c;具有FPU和DSP指令集&#xff0c;主频高达80MHz。 STM32CubeL4简介 STM32Cube 是 ST 提供的一套性能强大的免费开发工具和嵌入式软件模块&#xff0c;能够让开发人员在 STM32 平台上快速、轻松地开发应用。它包含两个关键部分&…

XXE基础知识整理(附加xml基础整理)

全称&#xff1a;XML External Entity 外部实体注入攻击 原理 利用xml进行读取数据时过滤不严导致嵌入了恶意的xml代码&#xff1b;和xss原理雷同 危害 外界攻击者可读取商户服务器上的任意文件&#xff1b; 执行系统命令&#xff1b; 探测内网端口&#xff1b; 攻击内网网站…

NAS系统折腾记 – Emby搭建家庭多媒体服务器

Emby简介 Emby是一款优秀的媒体服务器软件&#xff0c;致力于为用户提供丰富的多媒体体验。通过Emby&#xff0c;您可以方便地在家庭内的各种设备上观看您喜爱的电影、电视剧和其他视频内容。而且&#xff0c;Emby还具备强大的媒体管理功能&#xff0c;让您的影视资源井然有序…

nodejs 事件循环

浏览器的事件循环比较熟悉了&#xff0c;也来了解下 node 的。 参考来源&#xff1a; https://nodejs.org/en/guides/event-loop-timers-and-nexttick/ https://juejin.cn/post/6844903999506923528 事件循环分为 6 个阶段&#xff0c;图中每个框都是一个阶段&#xff0c;每个阶…

Vue服务端渲染

Vue服务端渲染 一、服务端渲染基础 1、概述 我们现在可以使用Vue,React等开发SPA单页面应用&#xff0c;单页面应用的优点&#xff0c;用户体验好&#xff0c;开发效率高&#xff0c;可维护性好等。 缺点&#xff1a;首屏渲染时间长&#xff08;在客户端通过JS来生成html来…

Vue-easy-tree封装及使用

1.使用及安装 下载依赖 npm install wchbrad/vue-easy-tree引入俩种方案 1.在main.js中引入 import VueEasyTree from "wchbrad/vue-easy-tree"; import "wchbrad/vue-easy-tree/src/assets/index.scss" Vue.use(VueEasyTree)2.当前页面引入 import VueEa…

蓝桥杯嵌入式第七届真题(完成) STM32G431

蓝桥杯嵌入式第七届真题(完成) STM32G431 题目 相关文件 main.c /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program body**********************…

layui-实现上下表,父子表单选加载事件

layui-实现上下表&#xff0c;父子表单选加载事件 代码HTML代码表格数据加载点击主表行&#xff0c;加载子表数据 实现效果图 代码 主子表&#xff0c;实现点击主表的单元格实现选中主表&#xff0c;并加载子表 HTML代码 //主表 <table class"layui-hide" id&q…

日志追踪-Tracing

1. 前言 分布式链路跟踪中有两个重要的概念&#xff1a;跟踪&#xff08;trace&#xff09;和 跨度&#xff08; span)。trace 是请求在分布式系统中的整个链路视图&#xff0c;span 则代表整个链路中不同服务内部的视图&#xff0c;span 组合在一起就是整个 trace 的视图在整个…

中科星图——Sentinel-1_SAR_GRD数据集

数据名称&#xff1a; Sentinel-1_SAR_GRD 数据来源&#xff1a; Copernicus 时空范围&#xff1a; 2022年8月-2023年2月 空间范围&#xff1a; 全国 数据简介&#xff1a; 哨兵1号&#xff08;Sentinel-1&#xff09;卫星是欧洲航天局哥白尼计划&#xff08;GMES&…

全球降水数据产品介绍

一、数据基本概况 降水数据在气象学、水文学、农业、生态学等领域有着广泛的用途。以下是一些降水数据的主要用途&#xff1a; 气象预报和监测&#xff1a; 降水数据是气象预报的重要组成部分&#xff0c;对预测天气、气候和自然灾害&#xff08;如暴雨、洪水&#xff09;至关…

day38 斐波那契数 爬楼梯 使用最小花费爬楼梯

题目1&#xff1a;509 斐波那契数 题目链接&#xff1a;509 斐波那契数 题意 斐波那契数列由0和1开始 后面的每一项数字都是前面两项数字之和 计算F(n) 动态规划 动规五部曲&#xff1a; 1&#xff09;dp数组及下标i的含义 dp[i] : 第i个斐波那契数值 i: 第i个斐…

使用 Visual Studio Code 在远程计算机上调试 PostgreSQL

使用 Visual Studio Code 在远程计算机上调试 PostgreSQL 1. 概述 PostgreSQL 是一个功能强大的开源关系数据库管理系统&#xff0c;适用于各种应用程序。在开发过程中&#xff0c;调试 PostgreSQL 对于识别和解决问题至关重要。在本博客中&#xff0c;我们将手把手教你使用客…

【考研408】操作系统笔记

文章目录 [toc] 计算机系统概述操作系统的基本概念操作系统的概念和特征操作系统的目标和功能&#xff08;**处理器管理、存储器管理、设备管理、文件管理、向用户提供接口、扩充机器**&#xff09; 操作系统的发展与分类操作系统的运行环境操作系统的运行机制 操作系统的体系结…

Node.js-1

Node.js 简介 定义&#xff1a;Node.js 是一个跨平台 JavaScript 运行环境&#xff0c;使开发者可以搭建服务器端的 JavaScript 应用程序 为什么 Node.js 能执行 JS 代码&#xff1a; Chrome 浏览器能执行 JS 代码&#xff0c;依靠的是内核中的 V8引擎&#xff08;即&#x…

【ELK】logstash快速入门

1.概述 1.1.什么是logstash&#xff1f; 之前我们聊了es&#xff0c;并且用docker搭建了一个eskibana的环境。es目前最普遍的用法是用来存储日志的&#xff0c;然后结合kibana对日志做一些可视化的工作。既然要收集日志&#xff0c;就面临着一个问题&#xff1a; 各个系统的…

Linux下新建用户

新建用户 sudo adduser -m username添加密码 sudo passwd username设置权限 sudo vi /etc/sudoers在user privilege这一行&#xff0c;仿照root&#xff0c;另起一行&#xff0c;添加上 设置命令解释器 sudo vi /etc/passwd找到新建用户名&#xff0c;将sh改为bash vi中…