首页 > 代码库 > HDU 1254
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;}
HDU 1254
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。