标签:des style http color io os ar for strong
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3152
3 5 5 4 3 9 1 3 2 7 5 3 7 2 0 1 2 8 0 9 1 1 2 1 8 1 9 8 9 2 0 3 6 5 1 5 7 9 0 5 1 1 5 3 4 1 2 1 6 5 3 0 7 6 1 6 8 5 1 1 7 8 3 2 3 9 4 0 7 6 4 1 5 8 3 2 4 8 3 7 4 8 4 8 3 4 0
Problem 1: 20 Problem 2: 19 Problem 3: 36
题意:
从左上到右下的路径中,寻找一条经过的格子中的数字之和最小的路径。
移动方向可以上、下、左、右。
PS:
由于以前做过HDU2084,所以第一感觉是用DP来做,但是此题可以再走已经走过的点,
所以只有用记忆化搜索!
优先队列优化!
代码如下:
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <queue> #include <vector> using namespace std; const int maxn = 177; struct node { int x, y; int dis; bool operator<(const node &s)const { return dis > s.dis; } }; int n; int mm[maxn][maxn]; int vis[maxn][maxn]; int dx[4] = {1,0,-1,0}; int dy[4] = {0,-1,0,1}; int BFS(int dis) { priority_queue<node> q; node fro, pre; fro.x = 0, fro.y = 0; fro.dis = dis; q.push(fro); while(!q.empty()) { fro = q.top(); q.pop(); for(int i = 0; i < 4; i++) { int xx = fro.x+dx[i]; int yy = fro.y+dy[i]; if(xx>=0&&xx<n&&yy>=0&&yy<n) { pre.x = xx, pre.y = yy; pre.dis = fro.dis + mm[xx][yy]; if(vis[xx][yy]==-1||vis[xx][yy]>pre.dis) { //没有访问过,或者当前的不是最短的 vis[xx][yy] = pre.dis; if(xx!=n-1 || yy!=n-1) q.push(pre); } } } } return vis[n-1][n-1]; } int main() { int cas = 0; while(scanf("%d",&n)&&n) { memset(vis,-1,sizeof(vis)); for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { scanf("%d",&mm[i][j]); } } int ans = BFS(mm[0][0]); printf("Problem %d: %d\n",++cas,ans); } return 0; }
HDU 3152 Obstacle Course(BFS+优先队列 重载)
标签:des style http color io os ar for strong
原文地址:http://blog.csdn.net/u012860063/article/details/39859083