设为首页 加入收藏

TOP

杭电ACM1180――诡异的楼梯~~广度优先搜索
2015-11-21 01:02:41 来源: 作者: 【 】 浏览:2
Tags:杭电 ACM1180 诡异 楼梯 广度 优先 搜索

这一题,简单的广搜就可以搞定,只是在搜索的时候判断比较麻烦,遇到楼梯的时候,有多种情况,停下来等,或者走其他路,来到楼梯,楼梯是否可以直接上等等的判断。

一开始WR,就是在楼梯可以直接上的时候,没有判断走出楼梯的那一个是否可以走,所以WR了3次。

下面AC的代码:

?

#include 
  
   
#include 
   
     using namespace std; class Node { public: int x, y, time; }; int M, N; char map[25][25]; int vis[25][25]; int xy[4][2] = { 0, 1, 0, -1, 1, 0, -1, 0 }; int start_x, start_y, end_x, end_y; queue 
    
      que; Node node; int bfs() { int fx, fy; node.x = start_x; node.y = start_y; node.time = 0; que.push(node); while(!que.empty()) { node = que.front(); que.pop(); if(node.x == end_x && node.y == end_y) //到达终点 { return node.time; } for(int i = 0; i < 4; i++) { fx = node.x + xy[i][0]; fy = node.y + xy[i][1]; if(fx >= 0 && fx < M && fy >= 0 && fy < N && map[fx][fy] != '*' && !vis[fx][fy]) { if(map[fx][fy] == '.' || map[fx][fy] == 'T') { Node temp; temp.x = fx; temp.y = fy; temp.time = node.time + 1; que.push(temp); vis[fx][fy] = 1; } else if(map[fx][fy] == '-') //开始楼梯横向 { if(node.time % 2 == 0) //偶数时间 { if(fx == node.x) //判断是否是横向走过来的 { if(node.y + 1 == fy) //向右走 fy = fy + 1; else //向左走 fy = fy - 1; if(fy >= 0 && fy < N && map[fx][fy] != '*' && !vis[fx][fy]) //判断走过楼梯之后的那个是否可以走 { Node temp; temp.x = fx; temp.y = fy; temp.time = node.time + 1; que.push(temp); vis[fx][fy] = 1; } } else //停留等楼梯的情况 { Node temp; temp.x = node.x; temp.y = node.y; temp.time = node.time + 1; que.push(temp); } } else //奇数时间 { if(fy == node.y) //判是否竖向走的 { if(node.x + 1 == fx) //向下走的情况 fx = fx + 1; else //向上的情况 fx = fx - 1; if(fx >= 0 && fx < M && map[fx][fy] != '*' && !vis[fx][fy]) //同上 { Node temp; temp.x = fx; temp.y = fy; temp.time = node.time + 1; que.push(temp); vis[fx][fy] = 1; } } else //停留 { Node temp; temp.x = node.x; temp.y = node.y; temp.time = node.time + 1; que.push(temp); } } } else if(map[fx][fy] == '|') //同上 { if(node.time % 2 == 0) { if(fy == node.y) { if(node.x + 1 == fx) fx = fx + 1; else fx = fx - 1; if(fx >= 0 && fx < M && map[fx][fy] != '*' && !vis[fx][fy]) { Node temp; temp.x = fx; temp.y = fy; temp.time = node.time + 1; que.push(temp); vis[fx][fy] = 1; } } else { Node temp; temp.x = node.x; temp.y = node.y; temp.time = node.time + 1; que.push(temp); } } else { if(fx == node.x) { if(node.y + 1 == fy) fy = fy + 1; else fy = fy - 1; if(fy >= 0 && fy < N && map[fx][fy] != '*' && !vis[fx][fy]) { Node temp; temp.x = fx; temp.y = fy; temp.time = node.time + 1; que.push(temp); vis[fx][fy] = 1; } } else { Node temp; temp.x = node.x; temp.y = node.y; temp.time = node.time + 1; que.push(temp); } } } } } } } int main() { while(cin >> M >> N) { for(int i = 0; i < M; i++) { for(int j = 0; j < N; j++) { cin >> map[i][j]; vis[i][j] = 0; if(map[i][j] == 'S' || map[i][j] == 's') //标记起点的位置 { start_x = i; start_y = j; } if(map[i][j] == 'T' || map[i][j] == 't') //标记终点位置 { end_x = i; end_y = j; } } } vis[start_x][start_y] = 1; while(!que.empty()) { que.pop(); } int ans = bfs(); cout << ans << endl; } return 0; }
    
   
  


?

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇POJ 3164Command Network && UVA .. 下一篇HDU 5115 Dire Wolf

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: