P1032 字串变换
这题题目说了
- 最多6个选项
- 若在10步(包含10步)以内
给了几个选项就一个一个试呗。
蒟蒻首先想到dfs,但是一条路搜到黑时间复杂度太高,或者根本搜不到。。(dalao们设计搜索深度AC
一般的,求解的个数用深搜,求最优解用广搜。
取出队首元素,找字串,更改,放入队列
字符串匹配的时候用STL可以大大提高敲代码效率。
开两个数组记录串的转换关系,然后以a串(原串)为起点开始搜索,搜索目标是b串。
需要一个map记录某个串是不是被搜到过,如果已经搜过了就不再继续搜 。
我们枚举当前队列中队头那个串的每一个位置,对每一个位置枚举所有可能的转换手段,然后去尝试拼接。
对于一个试图要改变的串str,我们试图在它的第i位用第j种手段改变,首先判断是否可行,然后再逐位拼接。并且如果拼接出的串是合法的,那么我们就把这个串继续压入队列,再次搜索,中间记录一下步数step和ans。
最后输出ans时判断,如果ans超过了步数限制直接输出无解,否则输出步数。
bfs代码如下:
string x,y;
string s1[10],s2[10];
queue<string > q;//存字符串
queue<int> qqe;//存步数
int n,ans=0;
map<string,int> mmp;//判重
void bfs(){
int i;
while(q.empty()==0){
string jojo=q.front();
ans=qqe.front();
q.pop();
qqe.pop();
if(jojo==y) {
//找到了
if(ans<=10) cout<<ans;
else cout<<"N