好像没问题的广搜10分
查看原帖
好像没问题的广搜10分
567522
Yuzilihhh楼主2023/11/15 19:39
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define lf long double
#define INF 0x7fffffff
#define debug(alpha) cout<<alpha<<endl
#define min(a,b) (a>b?b:a)
#define max(a,b) (a>b?a:b)
#define Max3(a,b,c) (max(max((a),(b)),(c)))
#define Min3(a,b,c) (min(min((a),(b)),(c)))
using namespace std;
namespace io
{
	template<typename T> inline void iread(T &x114){
		char c=' ';int wx114=1;x114=0;
		while(!isdigit(c)){c=getchar();if(c=='-')wx114=-1;}
		while(isdigit(c)){x114=x114*10+c-'0';c=getchar();}
		x114*=wx114;
	}
	template<typename T> inline void write(T x114){
		if(x114==0){putchar('0');return;}
		if(x114<0){putchar('-');x114=-x114;}
		int stk[50],top=0;
		while(x114){stk[++top]=x114%10;x114/=10;}
		while(top) putchar(stk[top--]+'0');
	}
}
int n,m,sx,sy,ex,ey,ans=0x7fffffff;
int a[55][55],mp[55][55];
char w;
bool vis[55][55][4];
int xx[4]={-1,0,1,0},yy[4]={0,-1,0,1};
map<char,int> st;
bool bfs()
{
	queue<int> qx,qy,qf,qs;
	qx.push(sx);
	qy.push(sy);
	qs.push(1);
	qf.push(st[w]);
	vis[sx][sy][st[w]]=true;
	while(!qx.empty())
	{
		if(qx.front()==ex&&qy.front()==ey)
		{
			ans=qs.front()-1;
			return true;
		}
		int x=qx.front(),y=qy.front(),f=qf.front(),s=qs.front();
		int dx=x+xx[f],dy=y+yy[f];
		if(dx>0&&dy>0&&dx<=n&&dy<=m&&!vis[dx][dy][f]&&!a[dx][dy])//Creep
		{
			qx.push(dx);
			qy.push(dy);
			qs.push(s+1);
			qf.push(f);
			vis[dx][dy][f]=1;
			dx=x+xx[f],dy=y+yy[f];
			if(dx>0&&dy>0&&dx<=n&&dy<=m&&!vis[dx][dy][f]&&!a[dx][dy])//Walk
			{
				qx.push(dx);
				qy.push(dy);
				qs.push(s+1);
				qf.push(f);
				vis[dx][dy][f]=1;
				dx=x+xx[f],dy=y+yy[f];
				if(dx>0&&dy>0&&dx<=n&&dy<=m&&!vis[dx][dy][f]&&!a[dx][dy])//Run
				{
					qx.push(dx);
					qy.push(dy);
					qs.push(s+1);
					qf.push(f);
					vis[dx][dy][f]=1;
				}
			}
		}
		int df=(f+1)%4;
		if(!vis[x][y][df])//Right
		{
			qx.push(x);
			qy.push(y);
			qs.push(s+1);
			qf.push(df);
		}
		df=(f+3)%4;
		if(!vis[x][y][(f+3)%4])//Left
		{
			qx.push(x);
			qy.push(y);
			qs.push(s+1);
			qf.push((f+3)%4);
		}
		qx.pop();
		qy.pop();
		qs.pop();
		qf.pop();
	}
	return false;
}
signed main()
{
	st['N']=0;
	st['W']=1;
	st['S']=2;
	st['E']=3;
	cin>>n>>m;
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j)
			cin>>mp[i][j];
	for(int i=1;i<n;++i)
		for(int j=1;j<m;++j)
			a[i][j]=mp[i][j]|mp[i][j+1]|mp[i+1][j]|mp[i+1][j+1];
	--n,--m;
	cin>>sx>>sy>>ex>>ey>>w;
	if(!bfs())
		puts("-1");
	else cout<<ans;
	return 0;
}

代码过长,码风不好,不喜勿喷,谢谢!

2023/11/15 19:39
加载中...