萌新求助
查看原帖
萌新求助
263374
FanYongchen楼主2021/2/21 13:04
#include <iostream>
#include <cstring>
#include <math.h>
#include <queue>
using namespace std;
struct Point
{
	int x,y;//坐标 
	int dire;//现在的朝向 
	int turn;//转弯次数 
};
const int D[4][2]={0,1,1,0,0,-1,-1,0};//右下左上 
int n,m;
char mp[1005][1005];
int vis[1005][1005][4]={0};//每个点最少的转弯次数 
bool check(int i,int j)
{
	return (i>=0&&j>=0&&i<n&&j<m&&mp[i][j]!='*');//判断 
}
void bfs(int i,int j)
{
	queue<Point> q;
	Point tmp;
	q.push({i,j,4,0});//dire=4是因为题目说在最开始的时候,Igor的车可以选择任何方向 
	while(!q.empty())
	{
		tmp=q.front();q.pop();
		if(mp[tmp.x][tmp.y]=='T') {cout<<"YES";return;}//找到了 
		for(int k=0;k<4;k++)//一个一个试方向 
		{
			if(abs(tmp.dire-k)==2) continue;//不能掉头 
			int xx=tmp.x+D[k][0];
			int yy=tmp.y+D[k][1];
			int tt=tmp.turn+(tmp.dire!=k);//计算出走到这一个所需的转弯次数 
			if(tmp.dire==4) tt=0;//如果是第一次刚开始走,转弯次数为0(是上面的q.push({i,j,4,0});的作用) 
			if(check(xx,yy)&&vis[xx][yy][k]==-1&&tt<=2)//是否是第一次走到这点 
				q.push({xx,yy,k,tt}),vis[xx][yy][k]=tt;
			if(check(xx,yy)&&vis[xx][yy][k]!=-1&&tt<=2)//若不是第一次走到这点 
				if(tt<vis[xx][yy][k]) vis[xx][yy][k]=tt,q.push({xx,yy,k,tt});//若转弯次数较少,更新并入队 
		}
	}
	cout<<"NO";
}
int main()
{
	memset(vis,-1,sizeof(vis));//先全部设为没走过 
	cin>>n>>m;
	int si=0,sj=0;//起点 
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
		{
			cin>>mp[i][j];
			if(mp[i][j]=='S') si=i,sj=j;
		}
	bfs(si,sj);
	return 0;
}

WA了第7个点,有没有大佬能帮助一下啊

2021/2/21 13:04
加载中...