比赛 20120703 评测结果 WWEEEWWEWW
题目名称 基因重组 最终得分 0
用户昵称 CC 运行时间 0.212 s
代码语言 C++ 内存使用 11.58 MiB
提交时间 2012-07-03 11:51:20
显示代码纯文本
#include <cstdio>
#include <algorithm>
int n,begin,end,ans;
int a[13],b[13],q[10001][2];
bool done[10000000];
void get(int u) {
	int t = n;
	while (t) {
		a[t] = u % 4;
		t--;
		u /= 4;
	}
}
	
int main() {
	freopen("genea.in","r",stdin);
	freopen("genea.out","w",stdout);
	scanf("%d\n", &n);
	char ch;
	for (int i = 1;i <= n;i++) {
		ch = getchar();
		if (ch == 'A') a[i] = 0;
		if (ch == 'C') a[i] = 1;
		if (ch == 'G') a[i] = 2;
		if (ch == 'T') a[i] = 3;
		begin = begin * 4 + a[i];
	}
	ch = getchar();
	for (int i = 1;i <= n;i++) {
		ch = getchar();
		if (ch == 'A') b[i] = 0;
		if (ch == 'C') b[i] = 1;
		if (ch == 'G') b[i] = 2;
		if (ch == 'T') b[i] = 3;
		end = end * 4 + b[i];
	}
	q[0][0] = begin;
	int head = 0,tail = 1;
	while (head != tail) {
		int now = q[head][0];
		done[now] = 1;
		if (now == end) {
			ans = q[head][1];
			break;
		}
		get(now);
		std::swap(a[1],a[2]);
		int o = 0;
		for (int i = 1;i <= n;i++) 
			o = o * 4 + a[i];
		if (!done[o]) {
			tail++;
			if (tail > 10000) tail = 0;
			q[tail][0] = o;q[tail][1] = q[head][1] + 1;
		}
		std::swap(a[1],a[2]);
		o = 0;
		for (int i = 2;i <= n;i++)
			o = o * 4 + a[i];
		o = o * 4 + a[1];
		if (!done[o]) {
			tail++;
			if (tail > 10000) tail = 0;
			q[tail][0] = o;q[tail][1] = q[head][1] + 1;
		}
		head++;
		if (head > 10000) head = 0;
	}
	printf("%d\n", ans);
	return 0;
}