1. 程式人生 > >hdoj 詭異的樓梯 1180 (bfs&&奇偶判斷) 好題

hdoj 詭異的樓梯 1180 (bfs&&奇偶判斷) 好題

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#define INF 0x3f3f3f3f
using namespace std;
char a[22][22];
int b[22][22];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int n,m;
struct zz
{
	int x;
	int y;
	int l;
}f1,f2;
bool judge(zz p)
{
	if(p.x<0||p.x>=n||p.y<0||p.y>=m||a[p.x][p.y]=='*'||b[p.x][p.y])
		return false;
	return true;
}
void bfs(int x,int y)
{
	memset(b,0,sizeof(b));
	queue<zz>q;
	f1.x=x;f1.y=y;f1.l=0;
	q.push(f1);
	b[x][y]=1;
	while(!q.empty())
	{
		f1=q.front();
		q.pop();
		if(a[f1.x][f1.y]=='T')
		{
			printf("%d\n",f1.l);
			return ;
		}
		for(int i=0;i<4;i++)
		{
			f2.x=f1.x+dx[i];
			f2.y=f1.y+dy[i];
			f2.l=f1.l+1;
			if(!judge(f2))
				continue;
			if(a[f2.x][f2.y]=='.'||a[f2.x][f2.y]=='T')
			{
				b[f2.x][f2.y]=1;
				q.push(f2);
			}
			else if((a[f2.x][f2.y]=='|'&&!(f1.l&1))||(a[f2.x][f2.y]=='-'&&(f1.l&1)))//表橫著走
			{
				if(i>1)
				{
					f2=f1;
					f2.l++;
					q.push(f2);
					continue;
				}
				f2.x+=dx[i];
				if(!judge(f2))
					continue;
				b[f2.x][f2.y]=1;
				q.push(f2);
			}
			else//表豎著走
			{
				if(i<2)
				{
					f2=f1;
					f2.l++;
					q.push(f2);
					continue;
				}
				f2.y+=dy[i];
				if(!judge(f2))
					continue;
				b[f2.x][f2.y]=1;
				q.push(f2);
			}
		}
	}
}
int main()
{
	int i,j;
	int sx,sy;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		for(i=0;i<n;i++)
			scanf("%s",a[i]);
		for(i=0;i<n;i++)
		{
			for(j=0;j<m;j++)
			{
				if(a[i][j]=='S')
				{
					sx=i;sy=j;
				}
			}
		}
		bfs(sx,sy);
	}
	return 0;
}