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=