POJ - 3087
用set的时候写错了。以后还是注意一下当容器中的元素类型为结构体类型时,写出排序规则。先这样记。
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<algorithm>
#include<queue>
#include<string>
#include<set>
using namespace std;
string str1,str2,str3;
int c;
int ans;
struct node
{
string s1,s2;
int step;
bool operator <(const node &t1) const{
return s1<t1.s1;
}
};
///当容器中的元素类型为结构体类型时,必须写出排序规则
set<node> se;
set<node>::iterator it;
void bfs(node s)
{
queue<node> q;
q.push(s);
se.insert(s);
while(!q.empty())
{
node now=q.front();
q.pop();
if(now.s1+now.s2==str3)
{
ans=now.step;
break;
}
else
{
string ss;
for(int i=0;i<c;i++)
{
ss+=now.s2[i];
ss+=now.s1[i];
}
node next;
next.s1=ss.substr(0,c);
next.s2=ss.substr(c);
next.step=now.step+1;
for(it=se.begin();it!=se.end();it++)
{
if((*it).s1==next.s1&&(*it).s2==next.s2)
break;
}
if(it==se.end())
{
q.push(next);
se.insert(next);
}
}
}
}
int main()
{
// freopen("in.txt","r",stdin);
ios::sync_with_stdio(false);
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
// se.clear();
ans=-1;
cin>>c;
cin>>str1>>str2>>str3;
node w;
w.s1=str1;
w.s2=str2;
w.step=0;
bfs(w);
cout<<i<<" ";
if(ans==-1)
cout<<-1<<endl;
else
cout<<ans<<endl;
}
return 0;
}