洛谷 P1032 字串变换
题目描述
已知有两个字串 A, B 及一组字串变换的规则(至多6个规则):
A1 -> B1
A2 -> B2
规则的含义为:在 A$中的子串 A1 可以变换为 B1、A2 可以变换为 B2 …。
例如:A='abcd'B='xyz'
变换规则为:
‘abc’->‘xu’‘ud’->‘y’‘y’->‘yz’
则此时,A 可以经过一系列的变换变为 B,其变换的过程为:
‘abcd’->‘xud’->‘xy’->‘xyz’
共进行了三次变换,使得 A 变换为B。
输入输出格式
输入格式:
输入格式如下:
A B
A1 B1 (变换规则)
A2 B2
... ...
所有字符串长度的上限为 20。
输出格式:
输出至屏幕。格式如下:
若在 10 步(包含 10步)以内能将 A 变换为 B ,则输出最少的变换步数;否则输出"NO ANSWER!"
输入输出样例
abcd xyz
abc xu
ud y
y yz
3
string change(const string& now, int st, int num) //now字符串第st位,第num条变换规则
{
for(int i = ; i < a1[num].length(); ++i)
{
if(st + i >= now.length()) return ""; //若超出原字符串长度或
if(now[st + i] != a1[num][i]) return ""; //有一位不符合规则,就不能变换,返回空字符串
}
string ret;
//变换分三步
for(int i = ; i < st; ++i) ret += now[i];//1.将原字符串不用变换的前半部分复制下来
ret += b1[num]; //2.再加上变换部分
for(int i = st + a1[num].length(); i < now.length(); ++i) ret += now[i];//3.加上原字符串剩下部分
return ret;
}
用 string 的好处是,它支持加减运算,就是增加或减去某一字符串,而不用库里的 strcpy 函数。
2.再用bfs时,要记录之前的状态,防止又退回去,进入死循环。但这道题开 vis 数组就不太合适,因为每一个状态是一个字符串。所以最好开一个 map 来记录状态,并判重。
3.若按 2 的方法,因为是字符串的操作,大数据可能会超时,所以可以将字符串编码为 unsigned long long,一个简单的hash
ull hash(const string& now){
ull ret = ;
for (int i = ; i < now.length(); i++){
ret += now[i] - 'a' + ; ret *= ;
}
return ret;
}
完整代码
#include <cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<map>
using namespace std;
typedef unsigned long long ull;
const int maxn = ;
string a, b;
string a1[], b1[];
int cnt = ;
ull hash(const string& now){
ull ret = ;
for (int i = ; i < now.length(); i++){
ret += now[i] - 'a' + ; ret *= ;
}
return ret;
}
string change(const string& now, int st, int num)
{
for(int i = ; i < a1[num].length(); ++i)
{
if(st + i >= now.length()) return "";
if(now[st + i] != a1[num][i]) return "";
}
string ret;
for(int i = ; i < st; ++i) ret += now[i];
ret += b1[num];
for(int i = st + a1[num].length(); i < now.length(); ++i) ret += now[i];
return ret;
}
map<ull, int>mp; //相当于vis
void bfs()
{
mp.clear();
queue<string>q;
q.push(a); mp[hash(a)] = ;
while(!q.empty())
{
string now = q.front(); q.pop();
ull hn = hash(now);
if(mp[hn] >= ) break;
for(int i = ; i < cnt; ++i)
{
for(int j = ; j < now.length(); ++j)
{
string neww = change(now, j, i);
ull hw = hash(neww);
if(neww != "" && mp.find(hw) == mp.end())
{
q.push(neww); mp[hw] = mp[hn] + ;
if(neww == b) {printf("%d\n", mp[hw]); return;}
}
}
}
}
printf("NO ANSWER!\n");
}
int main()
{
cin >> a >> b;
while(cin >> a1[cnt] >> b1[cnt]) cnt++;
bfs();
return ;
}
值得一提的是,这里的 map 发挥了两个作用,一个是 vis 数组,另一个是相当于记录步数的 dis数组
洛谷 P1032 字串变换的更多相关文章
- [洛谷P1032] 字串变换
洛谷题目链接:字串变换 题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B ...
- 洛谷 P1032 字串变换题解
题目链接:https://www.luogu.org/problem/P1032 题目描述 已知有两个字串A,BA,B及一组字串变换的规则(至多66个规则): A_1A1 ->B_1B1 A ...
- 洛谷 P1032 字串变换 (BFS)
题目传送门 我即使是死了,钉在棺材里了,也要在墓里,用这腐朽的声带喊出 STL大法好 这题最麻烦的其实是处理字符串,真正的搜索部分我个人认为也就只有橙题或黄题的难度.而处理字符串,正如前面所说,STL ...
- 洛谷 P1032 字串变换 题解
每日一题 day19 打卡 Analysis 广搜+map判重 用find寻找字串,再用replace替换字串 这里的map相当于正常广搜的一个book的作用 #include<iostream ...
- 洛谷P1032 字串变换【bfs】
题目链接:https://www.luogu.org/problemnew/show/P1032 题意: 给定一个原字符串和目标字符串,以及几个字符串变换的规则. 问能否根据这几个规则在十步之内把原字 ...
- 洛谷P1032 字串变换-题解
https://www.luogu.org/problemnew/show/P1032--(题目传送) 好在数据范围很小,暴力一点也能过.思路较简单,按照所有规则,从第一位开始广搜. 注意:1.str ...
- 洛谷 P1032 字串变换(map)
题目传送门 解题思路: 搜索题,因为要求最少次数,用bfs. AC代码: #include<cstdio> #include<iostream> #include<cst ...
- 集训作业 洛谷P1032 字串变换
集训的题目有点多,先写困难的绿题吧(简单的应该想想就会了) 嗯,这个题看起来像个搜索呢(就是个搜索) 我们仔细想想就知道这个题肯定不能用深搜,可以优化的地方太少了,TLE是必然的. 那我们该怎么办呢? ...
- P1032 字串变换 字符串BFS
题目描述 已知有两个字串A,BA,B及一组字串变换的规则(至多66个规则): A_1A1 ->B_1B1 A_2A2 -> B_2B2 规则的含义为:在 AA中的子串 A_1A1 ...
随机推荐
- C# 反射和Type类
一.元数据和反射 1.1 定义 大多数程序都要处理数据,包括读.写.操作和显示数据.然而,对于某些程序来说,它们操作的不是数字.文本或图形,而是程序和程序类型本身的信息. ● 有关程序及其类型的数据被 ...
- Python和Java编程题(三)
1.题目:判断101到200之间有多少个素数,并输出所有素数 题目分析:判断一个数是否为素数,只需要判断这个数有没有除1和它自身外的其他因数.因此,判断这个数能否被2-它的平方根中的任意一个数整除即可 ...
- Java可以像Python一样方便爬去世间万物
前言: 之前在大二的时候,接触到了Python语言,主要是接触Python爬虫那一块 比如我们常用的requests,re,beautifulsoup库等等 当时为了清理数据和效率,还专门学了正则表达 ...
- 如何在 ASP.NET Core 测试中操纵时间?
有时候,我们会遇到一些跟系统当前时间相关的需求,例如: 只有开学季才允许录入学生信息 只有到了晚上或者周六才允许备份博客 注册满 3 天的用户才允许进行一些操作 某用户在 24 小时内被禁止发言 很显 ...
- mysql 主从模式总结(一)
1. 主从模式的部署步骤 目标:部署一个有3台主机的单主模式的MySQL分组. Primary:192.168.197.110. Secondary:192.168.197.111. Secondar ...
- 现如今的CDN网站加速技术,细说CDN
CDN技术应用越来越广泛的被各大互联网公司所应用.已经成为了互联网企业离不开的一种网络运维方式.什么是CDN? CDN 利用全局负载均衡技术将用户的访问指向离用户最近的工作正常的流媒体服务器上,由流媒 ...
- Vue+Highcharts完全使用
创建Comp组件 <template> <div class="x-bar"> <div :id="id" :option=&qu ...
- Java集合之Vector源码分析
概述 Vector与ArrayLIst类似, 内部同样维护一个数组, Vector是线程安全的. 方法与ArrayList大体一致, 只是加上 synchronized 关键字, 保证线程安全, 下面 ...
- 前端打包文件在 nginx 上 403 的解决办法
遇到的问题表现出来就是如题所述,因此作为题目. 我们知道,前端有很多方便的构建和打包工具,如 webpack 等,通常我们会把前端文件打包到dist目录下,部署到服务器上,如 nginx 等. 这次遇 ...
- Loadrunner 脚本录制-通过代理录制脚本
脚本录制-通过代理录制脚本 by:授客 QQ:1033553122 版本:Loadruner 11.0 A.PC端录制Web应用程序 步骤1:根据实际情况,选择对应的协议 本例中选择Web(HTTP/ ...