HDU 2612 Find a way(寻路)
2015-12-27 14:25
405 查看
题目链接:HDU 2612
题意:
给一张地图,"Y"和"M"表示两个人的位置,"#"表示道路不通,"."表示道路可行,"@"表示KFC,求从两个人分别从各自起点出发到一家KFC的最短路径和。
分析:
一开始是想对每一家KFC分别求出两个人的路径,然后相加,取最小值,可是这样果然TLE了,部分代码如下:
于是改了,先对每个人到每家KFC的最短路径做预处理,然后对每家KFC两个最短路径相加,再取最小值,这下就AC了。需要特别注意的是,有的KFC可能到达不了!所以每个人需要一个vis数组用以记录这个KFC能否到达,这有两个人都能到达了,才符合!
CODE:
题意:
给一张地图,"Y"和"M"表示两个人的位置,"#"表示道路不通,"."表示道路可行,"@"表示KFC,求从两个人分别从各自起点出发到一家KFC的最短路径和。
分析:
一开始是想对每一家KFC分别求出两个人的路径,然后相加,取最小值,可是这样果然TLE了,部分代码如下:
int bfs(int sx,int sy,int ex,int ey) {//(sx,sy)是人的起点坐标,(ex,ey)是KFC坐标 memset(vis, 0, sizeof(vis)); queue<Node> q; cur.a = sx, cur.b = sy, cur.step = 0; vis[sx][sy] = 1; q.push(cur); while (!q.empty()) { cur = q.front(); q.pop(); for (int i = 0; i < 4; i++) { tx = cur.a + dir[i][0]; ty = cur.b+ dir[i][1]; if (!valid(tx, ty)) continue; nextnode.a = tx, nextnode.b = ty, nextnode.step = cur.step + 1; vis[tx][ty] = 1; if (tx == ex&&ty == ey) return nextnode.step; q.push(nextnode); } } return -1; }
于是改了,先对每个人到每家KFC的最短路径做预处理,然后对每家KFC两个最短路径相加,再取最小值,这下就AC了。需要特别注意的是,有的KFC可能到达不了!所以每个人需要一个vis数组用以记录这个KFC能否到达,这有两个人都能到达了,才符合!
CODE:
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <queue> #include <cmath> #include <cctype> using namespace std; const int maxn = 210; char s[maxn], a[maxn][maxn]; int vis1[maxn][maxn],vis2[maxn][maxn]; int i, j, r, c, ans; int dis1[maxn][maxn], dis2[maxn][maxn]; int yx, yy, mx, my, tx, ty; int dir[4][2] = { {0,1},{1,0},{-1,0},{0,-1} }; int valid(int x, int y) { if (x < 0 || y < 0 || x >= r || y >= c || a[x][y] == '#') return 0; return 1; } struct Node { int a, b; int step; }cur, nextnode; void bfs(int sx, int sy, int dis[210][210],int vis[210][210]) { memset(vis, 0, sizeof(vis)); memset(dis, 0, sizeof(dis)); queue<Node> q; cur.a = sx, cur.b = sy, cur.step = 0; vis[sx][sy] = 1; q.push(cur); while (!q.empty()) { cur = q.front(); q.pop(); for (int i = 0; i < 4; i++) { tx = cur.a + dir[i][0]; ty = cur.b + dir[i][1]; if (!valid(tx, ty)||vis[tx][ty]) continue; nextnode.a = tx, nextnode.b = ty, nextnode.step = cur.step + 1; vis[tx][ty] = 1; if (a[tx][ty] == '@') { dis[tx][ty] = nextnode.step; //printf("(%d,%d) step:%d\n", tx, ty, nextnode.step); } q.push(nextnode); } } } int main() { #ifdef LOCAL freopen("in.txt", "r", stdin); //freopen("out.txt", "w", stdout); #endif while (~scanf("%d%d", &r, &c)) { for (i = 0; i < r; i++) { scanf("%s", s); for (j = 0; j < c; j++) { a[i][j] = s[j]; if (a[i][j] == 'Y') { yx = i; yy = j; } else if (a[i][j] == 'M') { mx = i; my = j; } } } memset(vis1, 0, sizeof(vis1)); bfs(yx, yy, dis1, vis1); //printf("*********\n"); memset(vis2, 0, sizeof(vis2)); bfs(mx, my, dis2, vis2); ans = 1000000000; for (i = 0; i < r; i++) { for (j = 0; j < c; j++) { if (a[i][j] == '@'&&vis1[i][j]&&vis2[i][j]) { ans = min(ans, dis1[i][j]+dis2[i][j]); } } } printf("%d\n", ans * 11); } return 0; }
相关文章推荐
- JS验证身份证的合法性
- python email.message:比较电子邮件
- IOS cocoapods 第三方库的管理工具
- Hibernate Validation使用示例及讲解
- BFPRT 算法java实现
- Boost学习笔记(2)
- 在windows环境下,使用Eclipse和gcc-Linaro工具链,对BeagleBone进行交叉编译和远程部署
- Linux信号通讯编程
- HighCharts源码学习---扩展函数wrap和扩展对象 extendClass
- socket programming in kernel
- 【重走普及路】【分治】【经典算法】快速幂
- 文章标题
- git 的基本用法
- 贪吃蛇详解Windows编程(一)
- DP---求给定矩阵中最大正方形的维度
- DP---求给定矩阵中最大正方形的维度
- (浮点数及整数)高精度乘除法
- Android—— ubuntu下【CTS】測试TV真机
- 18.1 老式图元文件格式
- MYSQL查看和增加用户权限