欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

POJ 1376 Robot G++

程序员文章站 2022-07-15 11:14:32
...

POJ 1376 Robot G++

POJ 1376 Robot G++

POJ 1376 Robot G++

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
//英语      看博友分析     博友程序更简洁      bfs 
int da[60][60];
int dis[60][60][4];
int vis[60][60][4]; 
int dx[4]={0,0,1,-1};//东 西 南 北 
int dy[4]={1,-1,0,0};
struct nod{
	int x;
	int y;
	int dir;
};
int main()
{
	while(1)
	{
		int n,m;
		cin>>n>>m;
		if(n==0 && m==0)
		{
			break;
		}
		memset(da,0,sizeof(da));
		memset(vis,0,sizeof(vis));
		memset(dis,-1,sizeof(dis));
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				int x;
				cin>>x;
				if(x==1)
				{
					da[i][j]=1;
					da[i+1][j]=1;
					da[i][j+1]=1;
					da[i+1][j+1]=1;
				}
			}
		}
		int sx,sy,ex,ey;
		cin>>sx>>sy>>ex>>ey;
		sx++;
		sy++;
		ex++;
		ey++;
		string s;
		cin>>s;
		int dir;
		if(s=="east") 
		{
			dir=0;//2 3
		}else if(s=="west")
		{
			dir=1;//2 3
		}else if(s=="south")
		{
			dir=2;//1 0
		}else if(s=="north")
		{
			dir=3;//1 0
		}
		queue<nod> que;
		que.push((nod){sx,sy,dir});
		vis[sx][sy][dir]=1;
		dis[sx][sy][dir]=0;
		while(que.empty()!=1)
		{
			int tx=que.front().x;
			int ty=que.front().y;
			int td=que.front().dir;

			que.pop();
			if(td==0 || td==1)
			{
				if(vis[tx][ty][2]==0)
				{
					vis[tx][ty][2]=1;
					dis[tx][ty][2]=dis[tx][ty][td]+1;
					que.push((nod){tx,ty,2});
				}
				if(vis[tx][ty][3]==0)
				{
					vis[tx][ty][3]=1;
					dis[tx][ty][3]=dis[tx][ty][td]+1;
					que.push((nod){tx,ty,3});
				}
			}else if(td==2 || td==3)
			{
				if(vis[tx][ty][0]==0)
				{
					vis[tx][ty][0]=1;
					dis[tx][ty][0]=dis[tx][ty][td]+1;
					que.push((nod){tx,ty,0});
				}
				if(vis[tx][ty][1]==0)
				{
					vis[tx][ty][1]=1;
					dis[tx][ty][1]=dis[tx][ty][td]+1;
					que.push((nod){tx,ty,1});
				}
			}
			if((tx+dx[td])>=2&&(tx+dx[td])<=n&&(ty+dy[td])>=2&&(ty+dy[td])<=m&&vis[tx+dx[td]][ty+dy[td]][td]==0&&da[tx+dx[td]][ty+dy[td]]==0)
			{
				vis[tx+dx[td]][ty+dy[td]][td]=1;
				dis[tx+dx[td]][ty+dy[td]][td]=dis[tx][ty][td]+1;
				que.push((nod){tx+dx[td],ty+dy[td],td});
			}
			if((tx+dx[td]*2)>=2&&(tx+dx[td]*2)<=n&&(ty+dy[td]*2)>=2&&(ty+dy[td]*2)<=m&&vis[tx+dx[td]*2][ty+dy[td]*2][td]==0&&da[tx+dx[td]][ty+dy[td]]==0&&da[tx+dx[td]*2][ty+dy[td]*2]==0)
			{
				vis[tx+dx[td]*2][ty+dy[td]*2][td]=1;
				dis[tx+dx[td]*2][ty+dy[td]*2][td]=dis[tx][ty][td]+1;
				que.push((nod){tx+dx[td]*2,ty+dy[td]*2,td});
			}
			if((tx+dx[td]*3)>=2&&(tx+dx[td]*3)<=n&&(ty+dy[td]*3)>=2&&(ty+dy[td]*3)<=m&&vis[tx+dx[td]*3][ty+dy[td]*3][td]==0&&da[tx+dx[td]][ty+dy[td]]==0&&da[tx+dx[td]*2][ty+dy[td]*2]==0&&da[tx+dx[td]*3][ty+dy[td]*3]==0)
			{
				vis[tx+dx[td]*3][ty+dy[td]*3][td]=1;
				dis[tx+dx[td]*3][ty+dy[td]*3][td]=dis[tx][ty][td]+1;
				que.push((nod){tx+dx[td]*3,ty+dy[td]*3,td});
			}						
		}
		/*
		for(int i=1;i<=n+1;i++)
		{
			for(int j=1;j<=m+1;j++)
			{
				int jg=33;
				for(int k=0;k<4;k++)
				{
					if(dis[i][j][k]!=-1)
					{
						jg=min(jg,dis[i][j][k]);
					}					
				}
				cout<<jg<<" ";
			}
			cout<<endl;
		}*/
		int ans=dis[ex][ey][0];
		for(int i=1;i<4;i++)
		{
			ans=min(ans,dis[ex][ey][i]);
		}
		cout<<ans<<endl;
	}
	return 0;
}