zoukankan      html  css  js  c++  java
  • HDU 1254 推箱子 BFS

    囧,一开始没有管人的情况,只看箱子,果然SB了。

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <map>
    #include <set>
    #include <vector>
    #include <string>
    #include <queue>
    #include <deque>
    #include <bitset>
    #include <list>
    #include <cstdlib>
    #include <climits>
    #include <cmath>
    #include <ctime>
    #include <algorithm>
    #include <stack>
    #include <sstream>
    #include <numeric>
    #include <fstream>
    #include <functional>
    
    using namespace std;
    
    #define MP make_pair
    #define PB push_back
    typedef long long LL;
    typedef unsigned long long ULL;
    typedef vector<int> VI;
    typedef pair<int,int> pii;
    const int INF = INT_MAX / 3;
    const double eps = 1e-8;
    const LL LINF = 1e17;
    const double DINF = 1e60;
    const int maxn = 10;
    const int dx[] = {-1,1,0,0};
    const int dy[] = {0,0,-1,1};
    
    struct Node {
        int x,y,pre;
        Node(int x,int y,int pre = -1): x(x), y(y), pre(pre) {}
    };
    
    int n,m,mp[maxn][maxn],sx,sy,ex,ey,tmp[maxn][maxn];
    int dist[maxn][maxn][4],px,py;
    bool vis[maxn][maxn];
    
    
    bool bfs1(int x1,int y1,int x2,int y2) {
        if(tmp[x1][y1] != 0 || tmp[x2][y2] != 0) return false;
        queue<int> qx,qy;
        qx.push(x1); qy.push(y1);
        memset(vis,0,sizeof(vis));
        vis[x1][y1] = true;
        while(!qx.empty()) {
            int x = qx.front(), y = qy.front();
            qx.pop(); qy.pop();
            if(x == x2 && y == y2) return true;
            for(int i = 0;i < 4;i++) {
                int nx = x + dx[i], ny = y + dy[i];
                if(!vis[nx][ny] && tmp[nx][ny] == 0) {
                    qx.push(nx); qy.push(ny); 
                    vis[nx][ny] = true;
                }
            }
        }
        return false;
    }
    
    int bfs() {
        queue<Node> box,man;
        box.push(Node(sx,sy,0));
        man.push(Node(px,py));
        for(int i = 0;i < 4;i++) dist[sx][sy][i] = -1;
        int x,y,nx,ny,xp,yp,nxp,nyp,pre;
        while(!box.empty()) {
            Node nowbox = box.front(), nowman = man.front();
            box.pop(); man.pop();
            x = nowbox.x; y = nowbox.y; pre = nowbox.pre;
            xp = nowman.x; yp = nowman.y;
            //printf("box: %d %d  man: %d %d time: %d
    ",x,y,xp,yp,dist[x][y][pre]);
            if(x == ex && y == ey) return dist[x][y][pre] + 1;
            for(int i = 0;i < 4;i++) {
                nx = x + dx[i]; ny = y + dy[i];
                nxp = x - dx[i]; nyp = y - dy[i];
                tmp[x][y] = 1;
                if((dist[nx][ny][i] == -1 || dist[nx][ny][i] >= dist[x][y][pre] + 1) 
                        && tmp[nx][ny] == 0
                        && bfs1(xp,yp,nxp,nyp)) {
                    dist[nx][ny][i] = dist[x][y][pre] + 1;
                    box.push(Node(nx,ny,i)); man.push(Node(x,y));
                }
                tmp[x][y] = 0;
            }
        }
        return -1;
    }
    
    int main() {
        int T; scanf("%d",&T);
        while(T--) {
            scanf("%d%d",&n,&m);
            memset(dist,-1,sizeof(dist));
            memset(tmp,0x3f,sizeof(tmp));
            for(int i = 1;i <= n;i++) {
                for(int j = 1;j <= m;j++) {
                    scanf("%d",&tmp[i][j]);
                    if(tmp[i][j] == 2) {
                        sx = i; sy = j;
                    }
                    if(tmp[i][j] == 3) {
                        ex = i; ey = j;
                    }
                    if(tmp[i][j] == 4) {
                        px = i; py = j;
                    }
                    if(tmp[i][j] != 1) tmp[i][j] = 0;
                }
            }
            printf("%d
    ",bfs());
        }
        return 0;
    }
    

      

  • 相关阅读:
    datalist标签
    meter标签
    audio标签
    video标签
    time标签
    figure标签
    正则收集
    js文字无缝滚动
    页面滚动到指定位置
    Css公共文件结构
  • 原文地址:https://www.cnblogs.com/rolight/p/3936968.html
Copyright © 2011-2022 走看看