hdu 1180诡异的楼梯(bfs)

时间数组标记是否将遇到的位置进队列即可,应该用优先队列也是可以的,不过麻烦。

#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
struct point
{
	int x,y,step;
}s,e;
queue<point> q;
int n,m,tim[25][25];
char map[25][25];
int h[4][2]={1,0,-1,0,0,1,0,-1};
int BFS()
{
	while(!q.empty()) q.pop();
	int i,j,xx,yy,shu; point t,tt;
	q.push(s);tim[s.x][s.y]=0;
	while(!q.empty())
	{
		t=q.front(); q.pop();
		for(i=0;i<4;i++)
		{
			xx=t.x+h[i][0]; yy=t.y+h[i][1];
			if(xx>=0&&xx<n&&yy>=0&&yy<m&&map[xx][yy]!='*')
			{
				tt.step=t.step+1;
				if(map[xx][yy]=='|') 
				{
					xx=xx+h[i][0]; yy=yy+h[i][1]; //对达楼梯对面 
					if(xx>=0&&xx<n&&yy>=0&&yy<m&&map[xx][yy]!='*') //楼梯前面还有路 
					{
						if(t.step%2!=0&&i<=1||t.step%2==0&&i>1)  tt.step+=1;
						if(tt.step<tim[xx][yy])
						{
							tt.x=xx; tt.y=yy; 
							q.push(tt);
							tim[xx][yy]=tt.step;
						}
					} 
				}
				else if(map[xx][yy]=='-')
				{
					xx=xx+h[i][0]; yy=yy+h[i][1]; //到达楼梯对面 
					if(xx>=0&&xx<n&&yy>=0&&yy<m&&map[xx][yy]!='*') //楼梯前面还有路 
					{
						if(t.step%2!=0&&i>1||t.step%2==0&&i<=1)  tt.step+=1;
						if(tt.step<tim[xx][yy])
						{
							tt.x=xx; tt.y=yy; 
							q.push(tt);
							tim[xx][yy]=tt.step;
						}
					} 
				}
				else 
				{
					if(tt.step<tim[xx][yy])
					{
						tt.x=xx; tt.y=yy; 
						q.push(tt);
						tim[xx][yy]=tt.step;
					}
				}
			}
		}
	}
	return tim[e.x][e.y];
}
int main(int argc, char *argv[])
{
	int i,j;
	while(cin>>n>>m)
	{
		for(i=0;i<n;i++)
		for(j=0;j<m;j++)
		{
			cin>>map[i][j];
			if(map[i][j]=='S')
			{
				s.x=i; s.y=j; s.step=0; tim[i][j]=0;
			}
			else if(map[i][j]=='T')
			{
				e.x=i; e.y=j;
			}
		}
		memset(tim,0x33,sizeof(tim));
		cout<<BFS()<<endl;
	}
	return 0;
}


 

你可能感兴趣的:(hdu 1180诡异的楼梯(bfs))