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
",vis[m]);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zuferj115/p/5248889.html