zoukankan      html  css  js  c++  java
  • BZOJ054_移动玩具_KEY

    题目传送门

    这道题我写IDA*写挂了,TLE+WA,只AC了两个点。

    这道题标算BFS+状态压缩。

    code:

    /**************************************************************
        Problem: 1054
        User: yekehe
        Language: C++
        Result: Accepted
        Time:84 ms
        Memory:40864 kb
    ****************************************************************/
     
    #include <bits/stdc++.h>
    using namespace std;
     
    int N,T;
     
    const int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
     
    int l[10000000],h,t;
    int f[1<<17];
     
    void BFS()
    {
        memset(f,127,sizeof f);
        l[++t]=N;
        f[N]=0;
            while(h<t){
                int front=l[++h];
                if(front==T){printf("%d",f[front]);return ;}
                        for(int i=0;i<4;i++){
                            if((front&(1<<i))!=(front&(1<<i+4))){
                                int to=front;
                                to^=(1<<i)+(1<<i+4);
                                if(f[to]>f[front]+1)f[to]=f[front]+1,l[++t]=to;
                            }
                            if(i!=3 && (front&(1<<i))!=(front&(1<<i+1))){
                                int to=front;
                                to^=(1<<i)+(1<<i+1);
                                if(f[to]>f[front]+1)f[to]=f[front]+1,l[++t]=to;
                            }
                        }
                        for(int i=4;i<8;i++){
                            if((front&(1<<i))!=(front&(1<<i+4))){
                                int to=front;
                                to^=(1<<i)+(1<<i+4);
                                if(f[to]>f[front]+1)f[to]=f[front]+1,l[++t]=to;
                            }
                            if(i!=7 && (front&(1<<i))!=(front&(1<<i+1))){
                                int to=front;
                                to^=(1<<i)+(1<<i+1);
                                if(f[to]>f[front]+1)f[to]=f[front]+1,l[++t]=to;
                            }
                        }
                        for(int i=8;i<12;i++){
                            if((front&(1<<i))!=(front&(1<<i+4))){
                                int to=front;
                                to^=(1<<i)+(1<<i+4);
                                if(f[to]>f[front]+1)f[to]=f[front]+1,l[++t]=to;
                            }
                            if(i!=11 && (front&(1<<i))!=(front&(1<<i+1))){
                                int to=front;
                                to^=(1<<i)+(1<<i+1);
                                if(f[to]>f[front]+1)f[to]=f[front]+1,l[++t]=to;
                            }
                        }
                        for(int i=12;i<16;i++){
                            if(i!=15 && (front&(1<<i))!=(front&(1<<i+1))){
                                int to=front;
                                to^=(1<<i)+(1<<i+1);
                                if(f[to]>f[front]+1)f[to]=f[front]+1,l[++t]=to;
                            }
                        }
            }
    }
     
    int main()
    {
        string S;
        for(int i=1;i<=4;i++){
            cin>>S;
            for(int j=1;j<=4;j++)N=(N<<1)+S[j-1]-'0';
        }//cin>>S;
        for(int i=1;i<=4;i++){
            cin>>S;
            for(int j=1;j<=4;j++)T=(T<<1)+S[j-1]-'0';
        }
        BFS();
        return 0;
    }
  • 相关阅读:
    如何使用 Python 進行字串格式化
    骨牌摆放问题 POJ 2411(状态压缩DP)
    ACM/OI中C++常用优化(实用/调试/技巧)代码(语法)
    Windows 系统如何完全卸载 VSCode
    Python 在VSCode中使用
    第十一场训练赛
    L1-046 整除光棍 (20分)
    Problem 330A
    POJ 2187 Beauty Contest (凸包 旋转卡壳)
    程序员:写作能收获什么?
  • 原文地址:https://www.cnblogs.com/Cptraser/p/8608002.html
Copyright © 2011-2022 走看看