HDU 1180 诡异的楼梯

http://acm.hdu.edu.cn/showproblem.php?pid=1180

#include "cstdio"
#include "cstring"
#include "queue"
#include "algorithm"
using namespace std;
int n,m, s;
char map[25][25];
int vis[25][25];
int move[4][2] = {0,-1,0,1,-1,0,1,0};
struct point
{
	int x, y, step;
}st;
queue<point>q;

bool cmp(point a, point b)
{
	return a.step < b.step;
}
void bfs();

int main()
{
	//freopen("1.in","r",stdin);
	//freopen("1.out","w",stdout);
	while(~scanf("%d %d",&n,&m))
	{
		memset(map,'*',sizeof(map));

		int i, j;
		getchar();

		for(i=0;i<n;i++)
		{
			gets(map[i]);
		}
		for(i=0;i<n;i++)
		{
			for(j=0;j<m;j++)
			{
				if(map[i][j] == 'S')
				{
					st.x = i;
					st.y = j;
					st.step = 0;
					map[i][j] = '*';
					break;
				}
			}
		}
		for(i=0;i<n;i++)
		{
			for(j=0;j<m;j++)
			{
				vis[i][j] = 1000;
			}
		}
		s = 1000;
		bfs();
		printf("%d\n",s);
	}
	return 0;
}

void bfs()
{
	while(!q.empty())
	{
		q.pop();
	}

	q.push(st);

	while(!q.empty())
	{
		int i=0;
		point now = q.front();
		q.pop();
		//printf("x = %d y = %d t = %d \n",now.x,now.y,now.step);

		if(map[now.x][now.y] == 'T')
		{
			s = now.step<s?now.step:s; //这里寻找最小的时间,直到队列为空
		}

		for(i=0;i<4;i++)
		{
			point next = now;
			int xx = now.x, yy = now.y;
			xx += move[i][0];
			yy += move[i][1];
			next.x = xx;
			next.y = yy;

			if(map[xx][yy] == '*') continue;
			if(xx>=n || xx<0 || yy>=m || yy <0) continue;

			int xxx = xx+move[i][0], yyy=yy+move[i][1];

			if(map[xx][yy] == '|')
			{
				if(xxx<n && xxx>=0 && yyy<m && yyy >=0)
				{
					next.x += move[i][0];
					next.y += move[i][1];
					next.step = now.step;
				}
				else continue;
				if(now.step%2==1 && i<2) //这个时候阶梯是   -  ,直接跳过去,时间加一,并且方向合适
				{
					next.step = now.step+1;
				}
				else if(now.step%2==0 && i>1)//这个时候阶梯是   |
				{ //这里以前写的!now.step%2
					next.step = now.step+1;
				}
				else
				{
					next.step += 2;				//其他情况下,需要等待一分钟,故加2
				}
			}
			else if(map[xx][yy] == '-')
			{
				if(xxx<n && xxx>=0 && yyy<m && yyy >=0)
				{
					next.x += move[i][0];
					next.y += move[i][1];
					next.step = now.step;
				}
				else continue;

				if(now.step%2==1 && i>1) //这个时候阶梯是   |
				{
					next.step += 1;
				}
				else if(now.step%2==0 && i<2)//这个时候阶梯是   -
				{
					next.step += 1;
				}
				else
				{
					next.step += 2;
				}
			}
			else
			{
				next.step++;
			}

			if(next.step < vis[next.x][next.y])
			{
				//printf("\t%d %d %d\n",next.x,next.y,next.step);
				vis[next.x][next.y] = next.step;
				q.push(next);
			}
		}
	}
}


posted @ 2014-07-30 10:34  豪气干云  阅读(140)  评论(0编辑  收藏  举报