题目链接
http://ac.jobdu.com/problem.php?pid=1482
说实话,看到这个题目完全没有思路,所以去看了很多代码,都是说用广搜,但是自己还是想了很久,然后看懂了学长的代码,照着抄理解了下。
然后意识到,真的是学的东西完全不会用,所以决定要努力,从现在开始也不晚。
#include<iostream>
#include<string.h>
#include<queue>
#include<algorithm>
#include<cstdio>
using namespace std;
struct node{
string str;
int step;
};
int vis[1600000];
queue<node> que;
int n;
string s;
int judge(string s)
{
if(s.find("2012")!=-1)
return 1;
return 0;
}
int getnum(string s)
{
int x=0;
for(int i=0;i<n;i++)
{
x*=3;
x+=s[i]-'0';
}
return x;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
// cin.ignore();
cin>>s;
//cout<<judge(s)<<endl;
while(!que.empty())
que.pop();
memset(vis,0,sizeof vis);
node test;
test.str=s;
test.step=0;
que.push(test);
int flag=0;
while(!que.empty())
{
test=que.front();
que.pop();
if(judge(test.str))
{
flag=1;
cout<<test.step<<endl;
break;
}
for(int i=0;i<n-1;i++)
{
swap(test.str[i],test.str[i+1]);
int num=getnum(test.str);
if(!vis[num])
{
vis[num]=1;
node p;
p.str=test.str;
p.step=test.step+1;
que.push(p);
}
swap(test.str[i],test.str[i+1]);
}
}
if(!flag)
cout<<"-1"<<endl;
}
return 0;
}