HDU 1254

http://acm.hdu.edu.cn/showproblem.php?pid=1254

暴搜,状态是四维的(箱子和人的坐标),向一个方向推箱子还要判断人能否走到推的位置,1A

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;

int n, m;
int tx, ty;
int vis[8][8][8][8],vis1[8][8];
int M[8][8];

struct node {
    int x, y, px, py, step;
    node() {};
    node(int x, int y, int px, int py, int step) :
        x(x), y(y), px(px), py(py), step(step) {
        };
};

node st;

int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};

struct point {
    int x, y;
    point(int x, int y) :
        x(x), y(y) {
        };
};

int bfs1(int x, int y, int px, int py) {
    queue <point> q;
    q.push(point(px, py));
    while(!q.empty()) {
        point u = q.front();
        q.pop();
        if(u.x == x && u.y == y) return 1;
        for(int i = 0; i < 4; i++){
            int xx = u.x + dx[i];
            int yy = u.y + dy[i];
            if(xx < 0 || yy < 0 || xx >=n || yy >= m) continue ;
            if(M[xx][yy] == 1 || vis1[xx][yy]) continue;
            vis1[xx][yy] = 1;
            q.push(point(xx, yy));
        }
    }
    return 0;
};

int bfs2() {
    queue <node> q;
    memset(vis, 0, sizeof(vis));
    q.push(st);
    vis[st.x][st.y][st.px][st.py] = 1;
    while(!q.empty()) {
        node u = q.front();
        q.pop();
        if(u.x == tx && u.y == ty) return u.step;
        for(int i = 0; i < 4; i++) {
            int xx = u.x + dx[i];
            int yy = u.y + dy[i];
            int px = u.x - dx[i];
            int py = u.y - dy[i];
            if(xx < 0 || yy < 0 || xx >= n || yy >=m || px < 0 || py < 0 || px >= n || py >= m) continue;
            if(M[xx][yy] == 1 || M[px][py] == 1) continue;
            if(vis[xx][yy][px][py]) continue;
            memset(vis1, 0, sizeof(vis1));
            vis1[u.x][u.y] = 1;
            int flag = bfs1(px, py, u.px, u.py);
            vis1[u.x][u.y] = 0;
            if(flag) {
                vis[xx][yy][px][py] = 1;
                q.push(node(xx, yy, px, py, u.step + 1));
            }
        }
    }
    return -1;
};

int main() {
    int T;
    scanf("%d", &T);
    while(T--) {
        scanf("%d%d", &n, &m);
        for(int i = 0; i < n; i++) {
                for(int j = 0; j < m; j++) {
                    scanf("%d", &M[i][j]);
                }
        }
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < m; j++) {
                if(M[i][j] == 3)
                    tx = i, ty = j;
                if(M[i][j] == 2)
                    st.x = i, st.y = j;
                if(M[i][j] == 4)
                    st.px = i, st.py = j;
            }
        }
        st.step = 0;
        printf("%d\n", bfs2());
    }
    return 0;
}

时间: 2024-08-05 06:46:05

HDU 1254的相关文章

HDU 1254 推箱子

一个很有意思的 BFS+DFS.附 数据. 本来今天的任务是多重背包,结果为了帮别人找WA点,自己也坑在这道题上了. 最后想了一组自己都没过的数据-发现想法都不对-果断换思路了. 正确思路是以箱子为起点做BFS找最短.每次移动的时候DFS判断人能不能移动到箱子的后面. 开始就我写一个BFS,什么数据都过了.这组过不了 1 7 4 0 0 0 0 0 0 1 0 0 2 0 3 1 4 1 0 1 0 1 0 1 0 1 0 1 0 0 0 实际上答案是2. 我写的是总步数最短时,箱子的最短步数.

HDU 1254 (经典游戏)推箱子 BFS+dfs

Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不能拉箱子,因此如果箱子被推到一个角上(如图2)那么箱子就不能再被移动了,如果箱子被推到一面墙上,那么箱子只能沿着墙移动. 现在给定房间的结构,箱子的位置,搬运工的位置和箱子要被推去的位置,请你计算出搬运工至少要推动箱子多少格. Input 输入数据的第一行是一个整数T(1<=T<=20),代表测试

HDU 1254——推箱子

这题跟 hdu 1734 push box 是一样的,只不过这题推的是一个箱子,另外求的是箱子被推了多少次,那么只要在箱子被推的时候 次数才加1,然后使用优先队列就ok了 写了1734就会觉得这题很水啦  HDU1734题解 网上主流的都是bfs+bfs,或者是bfs+dfs <span style="font-size:18px;">#include<iostream> #include<cstring> #include<algorithm

hdu - 1254 推箱子 (bfs+bfs)

http://acm.hdu.edu.cn/showproblem.php?pid=1254 题目意思很简单,只要思路对就好. 首先考虑搬运工能否到达推箱子的那个点,这个可以根据箱子前进方向得出搬运工需要到达的目的地,用另一个bfs判断,然后就类似两个点的bfs那样用一个数组标记状态, 需要注意箱子在边上的情况. 1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 using namespace std;

hdu 1254(推箱子游戏bfs+状态标记)

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1254 推箱子 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5181    Accepted Submission(s): 1439 Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N

hdu 1254(两个BFS) 推箱子

http://acm.hdu.edu.cn/showproblem.php?pid=1254 首先,要判断人是不是可以从4到达箱子的位置2,而且不止判断一次,因为推动箱子一步后,人的位置也会改变,所以每次移动箱子前都要判断 所以这里要用两个搜索,当每朝着一个方向移动一步箱子的时候,就需要判断 从 此刻的 人位置能不能到达箱子反方向的那个位置(人只能推箱子, 不能拉什么的)  注意人在移动的时候箱子对于人来说也算障碍物,这里需要开一个hash1的四维数组记录走过的位置,不然会死循环超时间 这个记录

搜索 [HDU 1254] 推箱子

推箱子 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5343    Accepted Submission(s): 1503 Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不能拉箱子

hdu 1254(搜索题)

推箱子 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7062    Accepted Submission(s): 2009 Problem Description 推 箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工 只能推箱子而不能拉箱

(bfs) hdu 1254

推箱子 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5891    Accepted Submission(s): 1671 Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不能拉箱子,