比赛 20120703 评测结果 AEEEEEEEEE
题目名称 基因重组 最终得分 10
用户昵称 Czb。 运行时间 0.671 s
代码语言 C++ 内存使用 68.13 MiB
提交时间 2012-07-03 10:58:01
显示代码纯文本
#include<stdio.h>
#include<queue>
#include<string.h>

using namespace std;

struct orz
{
	char c[13];
};

int n,m;

char s1[13],s2[13];

int flag[17000000];

queue <orz> q;

int num(char *c)
{
	int tmp=0;
	for(int i=0;i<n;i++)
	{
		tmp*=4;
		if(c[i]=='A')
			tmp+=0;
		else if(c[i]=='C')
			tmp+=1;
		else if(c[i]=='G')
			tmp+=2;
		else
			tmp+=3;
	}
	return tmp;
}

int main()
{
	freopen("genea.in","r",stdin);
	freopen("genea.out","w",stdout);
	scanf("%d\n",&n);
	scanf("%s\n%s\n",s1,s2);
	if(num(s1)==num(s2))
	{printf("0\n");return 0;}
	memset(flag,60,sizeof(flag));
	flag[num(s1)]=0;m=num(s2);
	orz tmp;
	strcpy(tmp.c,s1);
	q.push(tmp);
	while(!q.empty())
	{
		tmp=q.front();
		orz tmp1,tmp2;
		strcpy(tmp1.c,tmp.c);
		strcpy(tmp2.c,tmp.c+1);
		tmp1.c[0]=tmp.c[1];
		tmp1.c[1]=tmp.c[0];
		tmp2.c[n-1]=tmp.c[0];
		int t,t1,t2;
		t=num(tmp.c);
		t1=num(tmp1.c);
		t2=num(tmp2.c);
		if(t1==m||t2==m)
		{
			flag[m]=flag[t]+1;
			break;
		}
		if(flag[t1]>1000000000)
		{
			flag[t1]=flag[t]+1;
			q.push(tmp1);
		}
		if(flag[t2]>1000000000)
		{
			flag[t2]=flag[t]+1;
			q.push(tmp2);
		}
		q.pop();
	}
	printf("%d\n",flag[m]);
	return 0;
}