hust 1605 Gene recombination 广搜
题意:第一个字符串变成第二个字符串最少要几步
两种操作:1.左移一位。2.交换第一位和第二位
求最少步数,直接广搜,但是如果用十进制,要用 long long 会超时,如果用字符串,会超内存。在int范围内可以用4进制或5进制
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <queue> #include <string> #include <math.h> #include <map> using namespace std; char a[15],b[15]; int n,m,len,tp; map<int,int>vis; int solve(char c) { if(c=='A') return 1; if(c=='C') return 2; if(c=='G') return 3; if(c=='T') return 4; } int op1(int k) { int d[15]; for(int i=0; i<len; i++) { d[i]=k%5; k/=5; } k=0; swap(d[len-1],d[len-2]); for(int i=len-1; i>=0; i--) { k=k*5+d[i]; } return k; } int op2(int k) { int d[15]; for(int i=0; i<len; i++) { d[i]=k%5; k/=5; } for(int i=len; i>=1; i--) d[i]=d[i-1]; d[0]=d[len]; k=0; for(int i=len-1; i>=0; i--) { k=k*5+d[i]; } return k; } void bfs() { vis.clear(); queue<int>q; q.push(n); while(!q.empty()) { tp=q.front(); q.pop(); if(tp==m) return; int tem1=op1(tp); int tem2=op2(tp); if(!vis[tem1]&&tem1!=tp) { vis[tem1]=vis[tp]+1; q.push(tem1); } if(!vis[tem2]&&tem2!=tp) { vis[tem2]=vis[tp]+1; q.push(tem2); } } } int main() { while(scanf("%d",&len)!=EOF) { scanf(" %s",a); scanf(" %s",b); n=m=0; for(int i=0; i<len; i++) { n=n*5+solve(a[i]); m=m*5+solve(b[i]); } bfs(); printf("%d\n",vis[m]); } return 0; }