HDU - 5067 Harry And Dig Machine (bfs + 状态压缩)
2015-07-24 16:04
288 查看
题目大意:有一个n*m的网格,网格上面有k个地方有石头,现在要求从左上角出发,遍历所有有石头的地方,然后回到左上角,问最短距离是多少
解题思路:因为石头的总数小于等于10,所以可以进行压缩
设dp[i][j][state]表示在(i,j)位置,遍历的石头状态为state,走的最小距离,直接bfs即可
上面是我复杂化了,其实只是状态压缩而已,只需要计算一下每种状态的转移就可以了,不需要一格格的走。。。
解题思路:因为石头的总数小于等于10,所以可以进行压缩
设dp[i][j][state]表示在(i,j)位置,遍历的石头状态为state,走的最小距离,直接bfs即可
[code]#include <cstdio> #include <cstring> #include <algorithm> #include <map> #include <queue> using namespace std; #define N 55 #define S (1<<11) #define INF 0x3f3f3f3f struct Node { int x, y, state, step; }start; map<int, int> M; int n, m, stone_num; int dp [S], g ; int dir[4][2] = {{-1,0}, {1,0}, {0, -1}, {0,1}}; void init() { M.clear(); stone_num = 0; for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) { scanf("%d", &g[i][j]); if (g[i][j]) M[i * m + j] = stone_num++; } memset(dp, 0, sizeof(dp)); } int bfs() { queue<Node> q; start.x = 0; start.y = 0; if (g[0][0]) start.state = (1 << M[0]); else start.state = 0; start.step = 0; q.push(start); while (!q.empty()) { Node t = q.front(); q.pop(); int x = t.x, y = t.y; if (x == 0 && y == 0 && t.state == (1 << stone_num) - 1) { break; } for (int i = 0; i < 4; i++) { int xx = x + dir[i][0]; int yy = y + dir[i][1]; int state = t.state; int step = t.step; if (xx < 0 || yy < 0 || xx >= n || yy >= m ) continue; if (g[xx][yy]) state |= (1 << M[xx * m + yy]); if (dp[xx][yy][state]) continue; dp[xx][yy][state] = step + 1; Node tt; tt.x = xx; tt.y = yy; tt.state = state; tt.step = t.step + 1; q.push(tt); } } return dp[0][0][(1 << stone_num) - 1]; } int main() { while (scanf("%d%d", &n, &m) != EOF) { init(); if(stone_num == 0) printf("0\n"); else printf("%d\n", bfs()); } return 0; }
上面是我复杂化了,其实只是状态压缩而已,只需要计算一下每种状态的转移就可以了,不需要一格格的走。。。
[code]#include <cstdio> #include <cstring> #include <cstdlib> #include <queue> using namespace std; #define S (1 << 11) #define N 20 #define INF 0x3f3f3f3f struct Stone { int x, y; }stone ; struct Node { int state, pos; }start; int n, m; int dp[S] , cnt; void init() { int x; cnt = 1; stone[0].x = 0; stone[0].y = 0; for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) { scanf("%d", &x); if(x) { stone[cnt].x = i; stone[cnt++].y = j; } } } int dis(int i, int j) { return abs(stone[i].x - stone[j].x) + abs(stone[i].y - stone[j].y); } void solve() { memset(dp, 0x3f, sizeof(dp)); queue<Node> q; start.state = 1; start.pos = 0; q.push(start); dp[1][0] = 0; while (!q.empty()) { Node t = q.front(); q.pop(); int state = t.state; int pos = t.pos; for (int i = 1; i < cnt; i++) { if (!(state & (1 << i))) { if ((state | (1 << i)) == (1 << cnt) - 1) { dp[state | (1 << i)][i] = min(dp[state | (1 << i)][i], dp[state][pos] + dis(pos,i) + dis(0,i)); } else { if(dp[state | (1 << i)][i] > dp[state][pos] + dis(pos, i)) { dp[state | (1 << i)][i] = dp[state][pos] + dis(pos, i); Node tt; tt.state = state | (1 << i); tt.pos = i; q.push(tt); } } } } } int ans = INF; for(int i = 1; i < cnt; i++) ans = min(ans, dp[(1 << cnt) - 1][i]); printf("%d\n", ans); } int main() { while(scanf("%d%d", &n, &m) != EOF) { init(); if(cnt == 1) printf("0\n"); else solve(); } return 0; }
相关文章推荐
- HTTP Status 500 - Unable to compile class for JSP问题小结(解决)
- 程序中三种不同的出错处理方式比较
- 关于tomcat+MyEclipse的安装与配置
- sql 找到前三
- 浮点二进制表示
- c++ 获取本地ip地址
- IIS下PHP的ISAPI和FastCGI比较
- Java中方法的重载
- string 简单实现
- Model绑定机制1:简单类型+复杂类型
- Linux Samba 安装及配置
- 深入理解JavaScript 模块模式
- XMLHttpRequest对象
- TStringGrid的Rows索引值 和 Cells的 索引值, Row的赋值
- main函数的参数
- ios 在中国地区,24小时时间格式 系统设定下 获得12小时制时间的方法
- C# Attribute应用:类签名
- IOException Unable to resolve host "api.linkface.cn": No address associated with hostname
- 无向图中欧拉回路的求法 poj1041
- 【YII2学习笔记】20150724-2