1 条题解

  • 0
    @ 2025-10-8 16:48:32
    #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

    *【宽搜(难度:S4)】基因重组

    信息

    ID
    91
    时间
    5000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    84
    已通过
    43
    上传者