zoukankan      html  css  js  c++  java
  • 洛谷

    神奇bug,没有记录pre就show了,找了1个小时。

    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    
    int C=0;
    
    int encode(int *a)
    {
        int res=0;
        for(int i=0;i<16; i++)
        {
            if(a[i])
                res|=1;
            res<<=1;
        }
        return res>>1;
    }
    
    void decode(int code,int *a)
    {
        for(int i=15; i>=0; i--)
        {
            a[i]=code&1;
            code>>=1;
        }
    }
    
    
    struct dat
    {
        int cur;
        int pre;
    } d,dt,data[65536];
    
    queue<dat> q;
    
    void showbit(int s){
        string str;
        for(int i=0;i<16;i++){
            str=char((s&1)+'0')+str;
            s>>=1;
            if(i%4==3)
                str='
    '+str;
        }
        cout<<str<<endl;
    }
    
    void show(dat d)
    {
        //cout<<"show"<<endl;
        stack<int> s;
        s.push(d.cur);
        while(1)
        {
            if(d.pre==-1)
                break;
            s.push(d.pre);
            d=data[d.pre];
        }
    
        printf("%d",s.size()-1);
    
        int cur=s.top();
    
        while(!s.empty())
        {
            int nex=s.top();
            //showbit(cur);
    
            s.pop();
    
            for(int i=15;i>=0;i--){
                if(((cur>>i)&1)!=((nex>>i)&1)){
                    //cout<<bitset<32>(cur)<<endl;
                    //cout<<bitset<32>(nex)<<endl<<endl;
                    int t=16-i;
                    printf("%d%d",(t+3)/4,(t%4)==0?4:t%4);
                }
            }
            printf("
    ");
            cur=nex;
        }
    
        //showbit(cur);
    }
    
    int t;
    
    inline bool found(int code)
    {
        return (code==t);
    }
    
    void bfs(int s)
    {
        memset(data,-1,sizeof(data));
    
        d.cur=s;
        d.pre=-1;
    
        if(found(d.cur))
        {
            show(d);
            return;
        }
    
        data[d.cur]=d;
        q.push(d);
    
        while(!q.empty())
        {
            d=q.front();
            q.pop();
    
            //cout<<bitset<32>(d.cur)<<endl;
    
            for(int i=0;i<16;i++){
                for(int j=i+1;j<16;j++){
                    if((abs(i-j)==4||((i/4==j/4)&&(abs(i-j)==1)))&&(((d.cur>>i)&1)!=((d.cur>>j)&1))){
                        //cout<<"i="<<i<<" j="<<j<<endl;
                        dt.cur=(d.cur^((1<<i)^(1<<j)));
                        /*if(bitset<32>(d.cur).count()!=8&&bitset<32>(dt.cur).count()!=8){
                            cout<<bitset<32>(d.cur)<<endl;
                            cout<<bitset<32>(dt.cur)<<endl;
                        }*/
    
                        if(data[dt.cur].cur==-1){
                            dt.pre=d.cur;
                            data[dt.cur]=dt;
                            q.push(dt);
                            if(found(dt.cur)){
                                show(dt);
                                return;
                            }
                        }
                    }
                }
            }
        }
    }
    
    int main()
    {
        int a[16];
        for(int i=0; i<16; i++)
        {
            scanf("%1d",&a[i]);
        }
    
        int s=encode(a);
    
        /*printf("s=%d
    ",s);
        cout<<bitset<32>(s)<<endl;
    
        decode(s,a);
        for(int i=0; i<16; i++)
        {
            printf("%d%c",a[i]," 
    "[i%4==3]);
        }*/
    
    
        for(int i=0; i<16; i++)
        {
            scanf("%1d",&a[i]);
        }
        t=encode(a);
    
        /*printf("t=%d
    ",t);
        cout<<bitset<32>(t)<<endl;
    
        decode(t,a);
        for(int i=0; i<16; i++)
        {
            printf("%d%c",a[i]," 
    "[i%4==3]);
        }*/
    
        bfs(s);
    }
  • 相关阅读:
    简单的javascript抽奖程序
    Linux 二层协议架构组织
    常用正则表达式总结
    很好的矩阵覆盖问题
    很好的求幂的题目
    不错的题目-n个数连接得到的最大值
    netstat命令介绍-要用熟
    一次完整的http事务
    Apache vs. Nginx
    Python学习-生成器
  • 原文地址:https://www.cnblogs.com/Yinku/p/10542354.html
Copyright © 2011-2022 走看看