备战蓝桥杯---搜索(优化1)

显然,我们可以用BFS解决,具体实现与八数码类似:

下面是代码:

#include<bits/stdc++.h>
using namespace std;
#define N 3000000
string a,b;
int hh,dis[N],cnt;
struct node{string u,v;
}bian[7];
map<string,int> mp;
string huan[N];
queue<int> q;
int bfs(string a,string b){mp[a]=1;huan[++cnt]=a;dis[cnt]=0;q.push(cnt);while(!q.empty()){int tmp=q.front();q.pop();if(dis[tmp]==10) return 0;string now=huan[tmp];for(int i=1;i<=hh;i++){for(int j=0;j<now.length();){string nxt=now;int pos=now.find(bian[i].u,j);if(pos<0&&pos>=now.length()) break;j=pos+1;nxt.erase(pos,bian[i].u.length());nxt.insert(pos,bian[i].v);if(mp.find(nxt)!=mp.end()) continue;if(nxt.length()>20) continue;dis[++cnt]=dis[tmp]+1;mp[nxt]=cnt;huan[cnt]=nxt;q.push(cnt);if(nxt==b) return dis[cnt];}}}return 0;
}
int main(){cin>>a>>b;while(cin>>bian[++hh].u>>bian[hh].v) ;int u=bfs(a,b);if(!u) cout<<"NO ANSWER!";else cout<<u;
}

结果只过了87.5的数据(qaq)

实际上,这题虽然说只有6种变换法则,但是如果给的字符串恶心一点(比如适用同一法则的pos位置有很多,那么它的复杂度铁定远大于6^10,于是我们可以优化一下:

我们可以先从头变换5次,再从尾变换5次,然后对两组dis进行拼接。这样就把6^10降成了6^5*2。

下面为AC代码:

#include<bits/stdc++.h>
using namespace std;
#define N 1000000
string a,b;
int hh,disA[N],cnt,disB[N];
struct node{string u,v;
}bian[7];
map<string,int> mp;
string huan[N];
queue<int> q;
int bfs(string a,string b,int y,int dis[]){while(!q.empty()) q.pop();mp[a]=++cnt;huan[cnt]=a;dis[cnt]=0;q.push(cnt);while(!q.empty()){int tmp=q.front();q.pop();if(dis[tmp]==5) return 0;string now=huan[tmp];for(int i=1;i<=hh;i++){for(int j=0;j<now.length();){string nxt=now;if(y==1){int pos=now.find(bian[i].u,j);if(pos<0&&pos>=now.length()) break;j=pos+1;nxt.erase(pos,bian[i].u.length());nxt.insert(pos,bian[i].v);}if(y==0){int pos=now.find(bian[i].v,j);if(pos<0&&pos>=now.length()) break;j=pos+1;nxt.erase(pos,bian[i].v.length());nxt.insert(pos,bian[i].u);}   if(nxt.length()>20) continue;if(mp.find(nxt)!=mp.end()&&dis[mp[nxt]]!=-1) continue;if(mp.find(nxt)==mp.end()){dis[++cnt]=dis[tmp]+1;mp[nxt]=cnt;huan[cnt]=nxt;q.push(cnt);}else{dis[mp[nxt]]=dis[tmp]+1;q.push(mp[nxt]);}}}}return 0;
}
int main(){cin>>a>>b;while(cin>>bian[++hh].u>>bian[hh].v) ;memset(disA,-1,sizeof(disA));memset(disB,-1,sizeof(disB));bfs(a,b,1,disA);bfs(b,a,0,disB);int min1=11;for(int i=1;i<=cnt;i++){if(disA[i]!=-1&&disB[i]!=-1)min1=min(min1,disA[i]+disB[i]);}if(min1>10) cout<<"NO ANSWER!";else cout<<min1;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ERP 系统架构的设计与实践总结

企业资源计划&#xff08;ERP&#xff09;系统是一种集成多个业务功能的综合性软件解决方案。在设计和实践 ERP 系统架构时&#xff0c;需要考虑诸多因素&#xff0c;以确保系统能够满足企业的需求&#xff0c;并提供高效、可靠、安全的服务。本文将介绍一些关键的设计原则和实…

pytorch索引和切片

目录 1. 按索引方式取数据2. 以python切片方式取数据3. 指定index取数据4. ...代表除其前后指定维度外的所有维度5. masked_select() 使用掩码选择元素6. take 矩阵打平后选取 1. 按索引方式取数据 a[0,0,2,4] 其中0&#xff0c;0&#xff0c;2&#xff0c;4是索引从0开始 2. …

【节选】Go语言的100个错误使用场景|数据类型

Data types &#x1f31f; 章节概述&#xff1a; 基本类型涉及的常见错误 掌握 slice 和 map 的基本概念&#xff0c;避免使用时产生 bug 值的比较 低效的切片初始化&#xff08;#21&#xff09; 实现一个 conver 方法&#xff0c;将一个切片 Foo 转换成另一个类型的切片 Ba…

逻辑级数与逻辑延时优化实战

综述 FPGA设计无可避免的会在FF之间穿插组合逻辑&#xff0c;那么这些组合逻辑如何量化分析&#xff1f;如何优化收敛&#xff1f;如何从RTL设计时就预估到可能产生的延时大小&#xff1f; 接下来就通过一个简单的工程&#xff0c;进行实战演示。 原始工程 定义一个32的计数定…

STM32F407 CAN参数配置 500Kbps

本篇CAN参数适用 芯片型号&#xff1a;STM32F407xx系统时钟&#xff1a;168MHz&#xff0c;CAN挂载总线APB1为42M波 特 率 &#xff1a;500Kpbs引脚使用&#xff1a;TX_PB9&#xff0c;RX_PB8&#xff1b;修改为PA11PA12后&#xff0c;参数不变。 步骤一、打勾开启CAN&#xf…

企业级大数据安全架构(九)FreeIPA管理员密码忘记后如何修改

作者&#xff1a;楼高 1重置Directory Server管理员密码 1.1停止directory server服务 [rootipa schema]# start-dirsrv HDP-HADOOP 如果你不知道你的实例名&#xff0c;可以通过如下方式获取 1.2生成一个新的HASH密码 停止服务后使用pwdhash命令生成一个新的HASH密码 [r…

Android电动汽车充电服务vue+uniAPP微信小程序

本系统利用SSM和Uniapp技术进行开发电动汽车充电服务系统是未来的趋势。该系统使用的编程语言是Java&#xff0c;数据库采用的是MySQL数据库&#xff0c;基本完成了系统设定的目标&#xff0c;建立起了一个较为完整的系统。建立的电动汽车充电服务系统用户使用浏览器就可以对其…

使用maven对springboot项目进行瘦身

目录 一、什么是Maven 二、springboot 项目 三、springboot 项目瘦身 一、什么是Maven Maven是一个基于Java的项目管理和构建工具。它通过提供一个一致的项目结构、自动化构建脚本和依赖管理系统&#xff0c;简化了Java项目的构建过程。 Maven使用一种称为POM&#xff08;…

Axure Cloud for Business On-Premises 本地服务端部署说明(支持Axure8/9/10)

Axure9不再⽀持SVN&#xff0c;只能通过AxureCloud进⾏团队协作&#xff0c;众所周知&#xff0c;因为国内没有服务器&#xff0c;所以速度非常的慢&#xff0c;为了解决这个问题&#xff0c;本⽂指导如何在公司内⽹或者服务器私有化部署Axure Cloud for Business On-Premises。…

flask+pyinstaller实现mock接口,并打包到exe运行使用postman验证

flask代码 from flask import Flask, request, jsonifyapp Flask(__name__)app.route("/login", methods[POST]) def login():username request.json.get("username").strip() # 用户名password request.json.get("password").strip() # 密…

计算机网络-数据链路层概述(功能概述 链路 数据链路 物理通道 逻辑通道)

文章目录 总览数据链路层的研究思想数据链路层的基本概念数据链路层功能概述 总览 封装成帧指的是数据链路层将来自上层的网络层数据包&#xff08;如IP数据报&#xff09;添加上自己的帧头和帧尾&#xff0c;形成一个完整的帧。这个过程包括了对数据的封装&#xff0c;以便于在…

MacBook有必要装清理软件吗?CleanMyMac的一些主要特点

MacBook是苹果公司的一款高端笔记本电脑&#xff0c;但是&#xff0c;随着使用时间的增长&#xff0c;MacBook也会出现一些问题&#xff0c;比如运行缓慢、卡顿、垃圾文件堆积、磁盘空间不足等。这些问题不仅影响了用户的使用体验&#xff0c;也可能对MacBook的寿命和安全性造成…