zoukankan      html  css  js  c++  java
  • 孤岛营救问题 (BFS+状压)

    https://loj.ac/problem/6121

    BFS + 状压

    写过就好想,注意细节debug

    #include <bits/stdc++.h>
    #define read read()
    #define up(i,l,r) for(register int i = (l);i <= (r);i++)
    #define down(i,l,r) for(register int i = (l);i >= (r);i--)
    #define traversal_vedge(i) for(register int i = head[u]; i ;i = e[i].nxt)
    #define ll long long
    using namespace std;
    int read
    {
        int x = 0, f = 1; char ch = getchar();
        while(ch < 48 || ch > 57) {if(ch == '-')f = -1; ch = getchar();}
        while(ch >=48 && ch <=57) {x = 10 * x + ch - 48;ch = getchar();}
        return x * f; 
    }
    void write(int x)
    {
        if(x < 0) x = -x,putchar('-');
        if(x > 9) write(x/10);
        putchar(x%10 + 48);
    }
    //-----------------------------------------------------------------
    const int N = 12;
    int n,m,p,k,s;
    int maps[N][N][N][N],cnt[N][N],type[N][N][N],vis[N][N][(1<<N)];
    int dx[] = {0,0,0,-1,1},dy[] = {0,-1,1,0,0};
    
    void readdata()
    {
        n = read; m = read; p = read; k = read;
        int x1,x2,y1,y2,G;
        while(k--)
        {
            x1 = read; y1 = read; x2 = read; y2 = read; G = read;
            if(G) maps[x1][y1][x2][y2] = maps[x2][y2][x1][y1] = G;
            else maps[x1][y1][x2][y2] = maps[x2][y2][x1][y1] = -1;
        }
        s = read; int q;
        while(s--)
        {
            x1 = read; x2 = read; q = read;
            type[x1][x2][++cnt[x1][x2]] = q;
        }
    }
    
    struct node{
        int x,y,step,state;
    };
    
    int get_state(int x,int y)
    {
        int ans = 0;
        up(i,1,cnt[x][y]) ans |= (1<<(type[x][y][i] - 1));
        return ans;
    }
    
    int bfs()
    {
        queue <node> q;
        int s = get_state(1,1);
        q.push((node){1,1,0,s} );
        vis[1][1][s] = 1;
        while(!q.empty())
        {
            node u = q.front(); q.pop();
            int x = u.x,y = u.y;
            if(x == n && y == m) return u.step;
            up(i,1,4)
            {
                int nx = x + dx[i],ny = y + dy[i];
                if(nx < 1 || ny < 1 || nx > n || ny > m) continue;
                int obstacle = maps[x][y][nx][ny];
                if(obstacle == -1) continue;
                if( obstacle > 0 && (u.state & 1<<(obstacle - 1)) == 0 ) continue;//debug obstacle - 1 <- 1 - obstacle
                int ns = u.state|get_state(nx,ny);//degug u.state <- s;
                if(vis[nx][ny][ns]) continue;
                vis[nx][ny][ns] = 1;
                q.push( (node){nx,ny,u.step+1,ns} );
            }
        }
        return -1;
    }
    
    int main()
    {
        freopen("input.txt","r",stdin);
        readdata();
        printf("%d
    ",bfs());
        return 0;
    }
  • 相关阅读:
    浅谈 unix, linux, ios, android 区别和联系
    比 Java 更具争议的 PHP,处处留坑?
    JavaScript 对象
    前端:for、foreach、for in、for of、$.each、$().each的区别
    java按照关键字指定的key删除redis(支持模糊删除)
    单点登录SSO
    页面打印的总结
    Jquery对selec操作的总结
    JS判断操作系统
    动态生成js的正则,替换字符串
  • 原文地址:https://www.cnblogs.com/mzg1805/p/10410449.html
Copyright © 2011-2022 走看看