调吐了,样例没输出(有注释)
查看原帖
调吐了,样例没输出(有注释)
242524
JRzyh楼主2021/8/19 22:23

写法比较奇怪qwq

////////////////////////
///////////////////////
//////////////////////
/////////////////////
/////Author/////////
//////zyh//////////
//////////////////
/////////////////
////////////////
///////////////
//////////////
/////////////
////////////
#include<bits/stdc++.h>
#define EL putchar('\n')
#define SP putchar(' ')
using namespace std;
int read(){int x;scanf("%d",&x);return x;}
long long readll(){long long x;scanf("%lld",&x);return x;}
void print(int x){printf("%d",x);}
void print(long long x){printf("%lld",x);}
struct node
{
	int x,y,dis,to;
	node(int _x,int _y,int _to,int _dis=0){x=_x;y=_y;dis=_dis;to=_to;}
	/*
	to:
		0:^
		1:v
		2:>
		3:< 
	*/
};
int cton(char c)//方向字母变数字 
{
	if(c=='N')return 0;
	if(c=='S')return 1;
	if(c=='E')return 2;
	if(c=='W')return 3;
}
int turnright(int x)//右转 
{
	if(x==0)return 2;
	if(x==1)return 3;
	if(x==2)return 1;
	if(x==3)return 0;
} 
int turnleft(int x)//左转 
{
	if(x==0)return 3;
	if(x==1)return 2;
	if(x==2)return 0;
	if(x==3)return 1;
} 
node Creep(node x)//走一步 
{
	if(x.to==0)x.y+=1;
	if(x.to==1)x.y-=1;
	if(x.to==2)x.x+=1;
	if(x.to==3)x.x-=1;
	return x;
} 
queue<node>q;
bitset<60>b[60][4]/*判走过*/,c[60]/*判障碍*/;
int n,m,x,y,tx,ty;
char ch;
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			int a=read();
			if(a==1)
			{
				c[i][j]=c[i][j+1]=c[i+1][j+1]=c[i+1][j]=1;//考虑交点不考虑格子 
			}
		}
	}
	cin>>x>>y>>tx>>ty>>ch;
	q.push(node(x,y,cton(ch)));//start 
	b[x][y][cton(ch)]=1;
	while(!q.empty())
	{
		node t=q.front();
		q.pop();
		cout<<t.x<<" "<<t.y<<" "<<t.to<<" "<<t.dis<<endl; //调试 
		if(t.x==tx&&t.y==ty)//搜到输出 
		{
			cout<<t.dis;
			return 0;
		}
		if(!b[t.x][t.y][turnright(t.to)])//右转没走过 
		{
			q.push(node(t.x,t.y,turnright(t.to),t.dis+1));//右转
			b[t.x][t.y][turnright(t.to)]=1;
		}
		if(!b[t.x][t.y][turnleft(t.to)])//左转没走过
		{
			q.push(node(t.x,t.y,turnleft(t.to),t.dis+1));//左转
			b[t.x][t.y][turnright(t.to)]=1;
		}
		node temp=t;
		for(int i=1;i<=3;i++)//可以 走三步 
		{
			temp=Creep(temp);//前进一步 
			if(temp.x<1||temp.x>=n||temp.y<1||temp.y>=m||c[temp.x][temp.y])break;//遇到障碍停 
			if(!b[temp.x][temp.y][temp.to])//假如没走过 
			{
				q.push(node(temp.x,temp.y,temp.to,t.dis+1));//那我走 
				b[temp.x][temp.y][temp.to]=1;
			}
		}
	}
 	return 0;
}

2021/8/19 22:23
加载中...