HDU2612,简单广搜题
2015-07-22 20:18
423 查看
这道题目真心蛋疼= =,看完题目,立马用双向广搜写了一发,交上去之后超时= =;后来想想,换个角度,枚举每个@,然后取最小总时间,尼玛还超时,代码实在改不动了,就去看了题解。
呵呵吧,贴上题解
呵呵吧,贴上题解
#include<cstdio> #include<iostream> #include<cstdlib> #include<cstring> #include<queue> using namespace std; struct node { int x,y,step; };//记录点的坐标以及到该点的时间 int n,m; char ch[209][209]; int dir[4][2] = {0,-1,-1,0,0,1,1,0}; int vis[209][209],num[209][209];//vis标记数组,num记录到@的总时间 bool is_ok(node a)//判断是否越界 { return a.x >= 0 && a.x < n && a.y >= 0 && a.y < m; } void bfs(int x,int y) { node s,t,ne; int i; s.x = x; s.y = y; s.step = 0; queue<node>q; while (!q.empty()) q.pop(); vis[x][y] = 1; q.push(s); while (!q.empty()) { t = q.front(); q.pop(); for (i = 0; i < 4; ++i) { ne.x = t.x + dir[i][0]; ne.y = t.y + dir[i][1]; ne.step = t.step + 1; if (is_ok(ne) && ch[ne.x][ne.y] != '#' && !vis[ne.x][ne.y]) //Y,M,和@都可以走 { vis[ne.x][ne.y] = 1; q.push(ne); if (ch[ne.x][ne.y] == '@') { num[ne.x][ne.y] += ne.step;//这里是+=,不是=,因为这点是@,记录的是两人到这的总时间 } } } } } int main() { int yx,yy,mx,my,i,j; while (~scanf("%d%d",&n,&m)) { for (i = 0; i < n; ++i) { getchar(); for (j = 0; j < m; ++j) { scanf("%c",&ch[i][j]); if (ch[i][j] == 'Y') { yx = i; yy = j; } else if (ch[i][j] == 'M') { mx = i; my = j; } } } memset(vis,0,sizeof(vis)); memset(num,0,sizeof(num)); bfs(yx,yy); memset(vis,0,sizeof(vis)); bfs(mx,my); int ans = 9999999; for (i = 0; i < n; ++i)//找最小总时间 { for (j = 0; j < m; ++j) { if (num[i][j] != 0 && ans > num[i][j]) ans = num[i][j]; } } printf("%d\n",ans*11); } return 0; }
相关文章推荐
- 搜索(HDU 1026)
- 八数码(hdu 1043)
- hdu1241Oil Deposits 深广搜
- poj1753 Flip Game 广搜哈希
- zoj 1148 The Game 一个晚上终于AC!
- LeetCode之Word Ladder
- Prime Path(广搜)
- hdu 1072
- hdu 1241
- ACM之广搜
- ACM-bfs之Find a way——hdu2612
- 1151 魔板
- hdu 1195 Open the Lock
- 搜索之“炸弹人”
- 分糖果
- hdu 3095 Eleven puzzle
- NYOJ--20(搜索)-题目----------------------------- 吝啬的国度
- NYOJ--21(搜索)-题目-----------------------------三个水杯
- NYOJ--58(搜索)-题目-----------------------------最少步数
- Eight_pku_1077(广搜).java