1 条题解
-
0
#include<bits/stdc++.h>//这是deque+map版本(map用于判重) using namespace std; struct node{char a[13];int dep,kt;}; deque<node>Q;//多组数据用双端队列,因为有clear()函数 map<int,bool>V;//判重用map容器,如果康托值超过1亿,则需采用map容器判重 int ys[256],n; int kt(node no) { int s=0;for(int i=1;i<=n;i++)s=s*4+ys[no.a[i]]; return s; } node AA(node no) { swap(no.a[1],no.a[2]); no.dep=no.dep+1;no.kt=kt(no); return no; } node BB(node no) { for(int i=2;i<=n;i++)swap(no.a[i-1],no.a[i]); no.dep=no.dep+1;no.kt=kt(no); return no; } int main() { ys['A']=0;ys['C']=1;ys['G']=2;ys['T']=3; while(scanf("%d",&n)!=EOF && n) { node stno;scanf("%s",stno.a+1); stno.dep=0;stno.kt=kt(stno);//准备出发状态 node edno;scanf("%s",edno.a+1); edno.kt=kt(edno);//准备目标状态 if(stno.kt==edno.kt){printf("0\n");continue;} V.clear();V[stno.kt]=1; Q.clear();Q.push_back(stno); bool bk=0; while(!Q.empty()) { for(int i=1;i<=2;i++) { node no=Q.front(); if(i==1)no=AA(no); else no=BB(no); if(V[no.kt]==0) { V[no.kt]=1; Q.push_back(no); if(no.kt==edno.kt){bk=1;break;} } } Q.pop_front(); if(bk)break; } printf("%d\n",Q.back().dep); } return 0; }
- 1
信息
- ID
- 91
- 时间
- 5000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 84
- 已通过
- 43
- 上传者