1032 字串变换

1032 字串变换

开学还有两天,我却没有努力补作业,在这里刷题…
开学之前练练一些78的搜索剪枝、迭代加深,启发式等
还有一些图论还没有结业,今天全部结束,然后明天搞搞作业准备开学
给定两个字符串
通过一系列的操作进行更改,貌似和搜索并没有关系?
解决这道题可以用迭代加深搜索,正常情况,dfs会超时,可以用迭代加深,就好了
这是第一种做法,做完这个我再来练习剪枝优化,毕竟我是来练习剪枝的
或者,双向广搜

迭代

普通的dfs要一路搜索到底,一路走南墙,可能会在错误答案上一路走到黑,从而浪费大量的时间
迭代加深搜索是什么
就是每次探测一个可能的答案,超过答案就会直接终止搜索,通过枚举答案一层一层的搜索,这样就既有了深搜的递归形式,又有了广搜的一层一层枚举,不会浪费时间,所以迭代加深有价值BDFS,结合了两个搜索的优点
算是比较模板了,需要弄多个剪枝优化

-------------重新---------------------------
嘿嘿嘿
我又来了兄弟们
这个题不就是一个递归搜索吗
显然
我忽略了这个题的本质
我忽略了这个题的颜色
所以说,我总感觉奥赛这个东西其实就是为时间复杂度来服务的
要是没有什么时间复杂度的限制,谁去搞这么麻烦的算法
先说一下题意
题意:
其实就是不停的进行转换
给定两个字符串 A串B串
然后给定几个等价交换的规则,A串换成B串的规则
最后问最快A ——>B的步骤是多少
分析:
典型的搜索
很明显
首先,循环输入,之前已经接触过了,存储到数组里面
双方向的搜索,省时间,每个搜索只需要搞一半

#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<map>
using namespace std;
map <string,bool> ed;
map <string,int> st;
string a,b;
string change[30][3];
int t=1,k=2;
int ans=999999;
void dfs(string now,int step)
{
   
	if(step>k)return;//超出步数直接终止,小小的优化 
	if(now==b)
	{
   
	
		ans=min(ans,step);//搜索到头,比较答案 
		return;
	}
	if(ed[now])//判断重复状态 
	{
   
		if(step>=st[now])return; 
	}
	ed[now]=1;st[now]=step;//记录层数 
	int loc=0;string changed;
	for(int i=1;i<=t;++i)
	{
   //找所有的字符串 
		loc=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值