杭电ACM1180——诡异的楼梯~~广度优先搜索

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

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

下面AC的代码:

#include <iostream>
#include <queue>
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 <Node> 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;
}
时间: 2024-12-12 09:24:03

杭电ACM1180——诡异的楼梯~~广度优先搜索的相关文章

HDU 1180 诡异的楼梯 (搜索)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1180 TLE n次.. 注意两点:1,S.T这三种位置是可以停留一秒的.即在没有路可走的时候可以停留一秒. 2, bfs宽搜应该使用优先队列, 并且vis标记加在将next节点push到队列中的时候. 然后就是奇偶判断什么的就可以了. 代码: 1 #define _CRT_SECURE_NO_WARNINGS 2 #include <functional> 3 #include <algor

杭电ACM1072——Nightmare~~广度优先搜索

题目的意思是:给你一个迷宫,0代表墙,1代表路,2代表起始位置,3代表终点,4代表爆破装置.一开始,你在2的位置,求到3的最少步数. 起初,你只有6秒钟的时间,时间减到0,你没到3的位置,代表不能出去,输出-1.想要增加时间,可以引爆爆破装置,引爆之后,时间重置为6,可以引爆多个.到引爆装置的时候,时间必须大于0,不然没有时间可以引爆. 迷宫最大是8 * 8.用广度优先搜索可以简单的解决问题. 下面的是AC的代码: #include <iostream> #include <cstdio

杭电acm 1180 诡异的楼梯 BFS

诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 19334    Accepted Submission(s): 5048Problem Description Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向. 比如下面的例子里,一开始楼梯在竖直

杭电ACM分类

杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDIATE DECODABILITY

杭电 2553 N皇后问题

http://acm.hdu.edu.cn/showproblem.php?pid=2553 N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 8077    Accepted Submission(s): 3603 Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不

杭电ACM题目分类

杭电ACM题目分类 基础题:1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028. 1029.1032.1037.1040.1048.1056.1058.1061.1070.1076.1089.1090.1091.1092. 1093.1094.1095.1096.1097.1098.1106.1108.1157.1163.1164.1170.1194.1196. 1197.1201.1202.1205.1219.1234.123

杭电1078(记忆搜索)

一道记忆搜索题,记忆搜索题就是搜索的形式+DP的思想! 题目: FatMouse has stored some cheese in a city. The city can be considered as a square grid of dimension n: each grid location is labelled (p,q) where 0 <= p < n and 0 <= q < n. At each grid location Fatmouse has hid

【转】对于杭电OJ题目的分类

[好像博客园不能直接转载,所以我复制过来了..] 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDI

杭电 HDU ACM 1046 Tempter of the Bone

Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 83458    Accepted Submission(s): 22740 Problem Description The doggie found a bone in an ancient maze, which fascinated him a