题目大意&&思路:
单方向查找某个目标,也算是搜索,只不过是单向搜索
BFS。
小小的用了一下MAP
AC program:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<iomanip>
#include<queue>
#include<map>
using namespace std;
int n;
string str1,str2,strpp;
int cas,cnt;
struct node
{
string ss;
}ans,tmp;
string fn(string s1,string s2)//合成函数
{
char tmp[2005];//string tmp;//2*n;
//一开始用string直接存储竟然有问题,囧
memset(tmp,0,sizeof(tmp));
int t1=0,t2=0;
for(int i=0;i<2*n;i++)
{
if(i&1)tmp[i]=s1[t1++];
else tmp[i]=s2[t2++];
}
tmp[2*n]='\0';
return tmp;
}
void gn(string s1)//拆分函数
{
for(int i=0;i<n;i++)
str1[i]=s1[i];
for(int i=n;i<2*n;i++)
str2[i-n]=s1[i];//注意下标
}
void bfs()
{
queue<node> que;
map<string,int> mm;
ans.ss=fn(str1,str2);
que.push(ans);
mm[ans.ss]++;//直接利用map的int下标来做标记
cnt=1;
while(!que.empty())
{
ans=que.front();
que.pop();
if(!ans.ss.compare(strpp))
{
cout<<cas++<<" "<<cnt<<endl;
return;
}
else
{
gn(ans.ss);
tmp.ss=fn(str1,str2);
if(!mm[tmp.ss])//没见过的则标记
{
mm[tmp.ss]++;//标记
cnt++;
que.push(tmp);
}
else
{
cout<<cas++<<" "<<-1<<endl;
return ;
//除了目标,其余的如果一循环,即还没找到目标就循环了话,以后也不会找到目标
//对目标也不用考虑在这里会被排除,因为第一次见到目标早就成功返回了
//这里只是捕捉其余的第二次见面
}
}
}
}
int main()
{
int test;
cin>>test;
cas=1;
while(test--)
{
cin>>n;
cin>>str1>>str2>>strpp;
cnt=0;
bfs();
}
//cin>>test;
return 0;}