广搜板子求助
查看原帖
广搜板子求助
654958
Light_az楼主2023/5/19 18:14

样例死活过不去

#include<bits/stdc++.h>
#define ll long long
#define F(i,j,n) for(ll i=j;i<=n;i++)
#define B(i,j,n) for(ll i=j;i>=n;i--)
#define D double
#define Test ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
const int N=1e6+10,NN=1e4+10;
ll n,m,k,x,y,u,v,w,cnt=0,ans=0,t=0,l,r,len,T,d;
ll mini=INT_MAX,maxi=0,p=998244353;
string s1,s2;
char c;
ll a[55][55],vis[55][55][5];
ll d1[5]={0,-1,0,1,0};
ll d2[5]={0,0,1,0,-1};
struct Node{
	ll x,y,step,d;
}S,E;
ll R(ll id){
	if(id<4) return id+1;
	return 1;
}
ll L(ll id){
	if(id>1) return id-1;
	return 4;
}
ll bfs(){
	queue<Node> q;
	q.push({S.x,S.y,0,d});
	vis[S.x][S.y][d]=1;
	while(!q.empty()){
		Node p=q.front();
		q.pop();
		if(p.x==E.x&&p.y==E.y) return p.step;
		if(!vis[p.x][p.y][R(p.d)]) vis[p.x][p.y][R(p.d)]=1,q.push({p.x,p.y,p.step+1,R(p.d)});
		if(!vis[p.x][p.y][L(p.d)]) vis[p.x][p.y][L(p.d)]=1,q.push({p.x,p.y,p.step+1,L(p.d)});
		F(i,1,3){
			ll xx=p.x+d1[p.d]*i,yy=p.y+d2[p.d]*i;
			if(!vis[xx][yy][p.d]&&xx>=1&&yy>=1&&xx<=n&&yy<=m&&!a[xx][yy]){
				vis[xx][yy][p.d]=1;
				q.push({xx,yy,p.step+1,p.d});
			}
		}
	}
	return -1;
}
int main(){
	cin>>n>>m;
	F(i,1,n) F(j,1,m){
		cin>>x;
		if(x) a[i-1][j]=a[i-1][j-1]=a[i][j]=a[i][j-1]=1;
	}
	cin>>S.x>>S.y>>E.x>>E.y>>c;
	if(c=='N') d=1;
	if(c=='E') d=2;
	if(c=='S') d=3;
	if(c=='W') d=4;
	cout<<bfs();
	return 0;
}
2023/5/19 18:14
加载中...