• HDU Stealing Harry Potter's Precious(状压BFS)


    状压BFS

    注意在用二维字符数组时,要把空格、换行处理好。

    #include<stdio.h>
    #include<algorithm>
    #include<string.h>
    #include<queue>
    using namespace std;
    #define INF 0x3f3f3f3f
    int sx,sy,C,n,m;
    int ans;
    bool vis[101][101][1<<5];
    char g[101][101];
    int key[101][101];
    int dx[]={1,0,-1,0},dy[]={0,1,0,-1};
    bool check(int a,int b){return 1<=a&&a<=n&&1<=b&&b<=m;}
    bool ok(int mask)
    {
       for(int i=1;i<=C;i++)
            if(mask&(1<<i));
           else return false;
           return true;
    }
    struct mask
    {
        int x,y,key,step;
        mask(int x,int y,int key,int step):x(x),y(y),key(key),step(step){};
    };
    queue<mask>q;
    int bfs()
    {//printf("%d %d",sx,sy);
        while(q.size())q.pop();
       memset(vis,false,sizeof(vis));
       q.push(mask(sx,sy,0,0));
       vis[sx][sy][0]=true;
        while(q.size())
        {
            mask tmp=q.front();q.pop();//printf("%d  %d %d
    ",tmp.x,tmp.y,tmp.key);
            if(ok(tmp.key))
                ans=min(ans,tmp.step);
            for(int i=0;i<4;i++)
            {
                int nx=tmp.x+dx[i];
                int ny=tmp.y+dy[i];
                int nkey=tmp.key;//printf("%d %d
    ",nx,ny);
                if(check(nx,ny)&&!vis[nx][ny][nkey]&&g[nx][ny]!='#')
                {
                     if(key[nx][ny])
                        nkey|=key[nx][ny];
                    vis[nx][ny][nkey]=true;
                    q.push(mask(nx,ny,nkey,tmp.step+1));
                }
            }
        }
        return ans==INF?-1:ans;
    }
    int main()
    {
        while(~scanf("%d %d",&n,&m)){
                getchar();//这里的getchar()吸收掉换行,刚刚没注意这里WA后,想了半个钟,可恨啊。。。。
            if(n==0&&m==0)break;
          ans=INF;
          memset(key,0,sizeof(key));
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
               scanf("%c",&g[i][j]);
               if(g[i][j]=='@')
               {
                   sx=i;
                   sy=j;
               }
            }
            getchar();
        }
       /* for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++)
            printf("%c",g[i][j]);
            printf("
    ");
        }*/
        scanf("%d",&C);
        int a,b;
        for(int i=1;i<=C;i++)
        {
            scanf("%d %d",&a,&b);
            key[a][b]=1<<i;
        }
        printf("%d
    ",bfs());
        }
    }
    View Code
  • 相关阅读:
    浅析堆与垃圾回收
    再探JVM内存模型
    索引使用的基本原则
    常见的索引模型浅析
    初识InnoDB体系架构和逻辑存储结构
    一条update SQL语句是如何执行的
    MySQL一条查询语句是如何执行的
    堆与优先队列
    ibatis BindingException Parameter 'status' not found. Available parameters are [arg1, arg0, param1, param2] 解决方法
    Mysql通过MHA实现高可用
  • 原文地址:https://www.cnblogs.com/zhgyki/p/9002059.html
Copyright © 2020-2023  润新知