题目:https://www.luogu.org/problemnew/show/P1032

字符串好复杂...先写了个 dfs ,RE一个点TLE一个点,不知该怎么改了...

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char a[],b[],c[][],d[][];
int n,ans=,inf=;
bool ck(char x[],int l1,int i,int j)
{
int l2=strlen(c[j]);
if(l1-i<l2)return ;
for(int t=;t<l2&&i+t<l1;t++)
if(x[i+t]!=c[j][t])return ;
return ;
}
bool cmp(char x[],int l1)
{
// int l1=x.length(),l2=b.length();
int l2=strlen(b);
if(l1!=l2)return ;
for(int i=;i<l1;i++)if(x[i]!=b[i])return ;
return ;
}
void print(char x[],int l)
{
printf("%d ",l);
for(int i=;i<l;i++)printf("%c",x[i]);
printf("\n");
}
void dfs(char x[],int s,int l)
{
if(cmp(x,l)){ans=min(ans,s); return;}
if(s>=)return;
char nxt[];
for(int i=;i<l;i++)
{
for(int j=;j<n;j++)
if(ck(x,l,i,j))
{
cout<<j<<endl;
int l1=strlen(c[j]),l2=strlen(d[j]),ln=;
for(int k=;k<i;k++)nxt[ln++]=x[k];
for(int k=;k<l2;k++)nxt[ln++]=d[j][k];
for(int k=i+l1;k<l;k++)nxt[ln++]=x[k];
dfs(nxt,s+,ln);
}
}
}
int main()
{
cin>>a; cin>>b; n=;
while(cin>>c[n]>>d[n])n++;
// while(~scanf("%s",&t))
// c[++n]=t,scanf("%s",&d[n]);
dfs(a,,strlen(a));
if(ans==inf)printf("NO ANSWER!");
else printf("%d\n",ans);
return ;
}

dfs

看到大家都是 bfs,确实找最小步数的话应该是 bfs 呢;

用了好多 STL,学到了...

思路没什么,就是不太好写,使用 STL 感觉很方便。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
using namespace std;
int n;
string a,b,c[],d[];
map<string,int>mp;
queue<pair<string,int> >q;
int main()
{
cin>>a>>b;
while(cin>>c[++n])cin>>d[n];
n--; mp[a]=;
q.push(make_pair(a,));
while(q.size())
{
string s=q.front().first; int t=q.front().second; q.pop();
int l=s.length();
if(t>)break;
for(int i=;i<=n;i++)
{
int l2=c[i].length();
for(int j=;j<=l-l2;j++)
{
if(s.substr(j,l2)!=c[i])continue;
string ns; ns.clear();//
if(j)ns+=s.substr(,j);//(起点,起点开始的长度)
ns+=d[i];
if(j+l2<l)ns+=s.substr(j+l2,l-j-l2+);
if(ns==b){printf("%d\n",t+); return ;}
if(mp.find(ns)==mp.end())
{
mp[ns]=t+;
q.push(make_pair(ns,t+));
}
}
}
}
printf("NO ANSWER!");
return ;
}

洛谷 P1032 [ NOIP 2002 ] 字串变换 —— 字符串+bfs的更多相关文章

  1. [COGS 0065][NOIP 2002] 字串变换

    65. [NOIP2002] 字串变换 ★★   输入文件:string.in   输出文件:string.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 已知有两个字 ...

  2. P1032 字串变换 字符串BFS

    题目描述 已知有两个字串A,BA,B及一组字串变换的规则(至多66个规则): A_1A1​ ->B_1B1​ A_2A2​ -> B_2B2​ 规则的含义为:在 AA中的子串 A_1A1​ ...

  3. 【题解】洛谷P1032 [NOIP2002TG]字串变换(BFS+字符串)

    洛谷P1032:https://www.luogu.org/problemnew/show/P1032 思路 初看题目觉得挺简单的一道题 但是仔细想了一下发现实现代码挺麻烦的 而且2002年的毒瘤输入 ...

  4. 「NOIP2002」「Codevs1099」 字串变换(BFS

    1099 字串变换 2002年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold   题目描述 Description 已知有两个字串 $A$, ...

  5. 洛谷P1032 字串变换【bfs】

    题目链接:https://www.luogu.org/problemnew/show/P1032 题意: 给定一个原字符串和目标字符串,以及几个字符串变换的规则. 问能否根据这几个规则在十步之内把原字 ...

  6. 洛谷 P1032 字串变换 (BFS)

    题目传送门 我即使是死了,钉在棺材里了,也要在墓里,用这腐朽的声带喊出 STL大法好 这题最麻烦的其实是处理字符串,真正的搜索部分我个人认为也就只有橙题或黄题的难度.而处理字符串,正如前面所说,STL ...

  7. codevs1099字串变换(Bfs)

    /* 最少步数问题 妥妥的Bfs 很显然队列里存的是串(可能存个数也可以 就像8数码那样) 然后每次队首元素弄出来 能换的都换一遍 最后每次换完的新串入队前先判断到头了没 最后说一句 String大法 ...

  8. [洛谷P1032] 字串变换

    洛谷题目链接:字串变换 题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B ...

  9. 洛谷 P1032 字串变换题解

    题目链接:https://www.luogu.org/problem/P1032 题目描述 已知有两个字串A,BA,B及一组字串变换的规则(至多66个规则): A_1A1​ ->B_1B1​ A ...

随机推荐

  1. Sql Server 优化 SQL 查询:如何写出高性能SQL语句

    1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个 10万条记录的表中查1条 ...

  2. [Windows Server 2008] DEDECMS(织梦)安全设置

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:DedeCms ...

  3. 删除ListView item数据 页面不刷新

    最近碰到一个匪夷所思的事情.就是我删除listView中一条item数据  网络请求成功了 但是页面不成功,一番折腾 ,找到问题 ,原来我给item 添加了北京点击事假,又给listView 被禁设置 ...

  4. The type new View.OnClickListener(){} must implement the inherited abstract method View.Onclicklis

    public class MainActivity extends Activity { protected Button startBrew = null; @Override protected ...

  5. 【sqli-labs】 less44 POST -Error based -String -Stacked Blind(POST型基于盲注的堆叠字符型注入)

    盲注漏洞,登陆失败和注入失败显示的同一个页面 可以用sleep函数通过延时判断是否闭合引号成功 这个方法有一点不好的地方在于,并不能去控制延时,延时的时间取决于users表中的数据数量和sleep函数 ...

  6. S3C2440时钟体系

    注:以下内容学习于韦东山老师arm裸机第一期视频教程 一. 2440时钟简介 1.1 2440是一个SOC(system on chip)系统,不仅有很多CPU,还有很多外设,在2440芯片手册有系统 ...

  7. servlet之@PostConstruct,@PreDestroy

    1.@PostConstruct说明 被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Serclet的inti()方法.被@PostCo ...

  8. 6.shell脚本

    6.1 shell基础语法 6.1.1 shell的概述 shell的基本概念 1.什么是shell shell是用户和Linux操作系统之间的接口,它提供了与操作系统之间的通讯方式 shell是一个 ...

  9. 利用open MP获取计算机核心数量的方法

    openMP是一款普遍通用的并行计算编程模型,使用它通常能够充分利用多核计算的优势. 以下是一种能够测试核心数量的方法: std::cout << "parallel begin ...

  10. JavaScript学习笔记之对象

    目录 1.自定义对象 2.Array 3.Boolean 4.Date 5.Math 6.Number 7.String 8.RegExp 9.Function 10.Event 在 JavaScri ...