40分,样例我输出为9?
查看原帖
40分,样例我输出为9?
846398
jomy楼主2023/8/25 21:38

寄

#include<bits/stdc++.h>
using namespace std;
int s[55][55][4],n,m;
int b[55][55];
struct S{
	int x,y,z;
};
queue<S>q;
bool e(int uu,int vv,int ww,int u,int v,int w){
	if(u<0||u>n||v<0||v>m||s[u][v][w]<s[uu][vv][ww]+1||b[u][v]||(v&&b[u][v-1])||(u&&b[u-1][v])||(u&&v&&b[u-1][v-1])){
		return false;
	}
	if(uu+3==u){
		if(b[u-1][v]||(v&&b[u-1][v-1])||(u-1&&b[u-2][v])||(u-1&&v&&b[u-1][v-1])) return false;
	}
	if(u+3==uu){
		if(b[u+1][v]||(v&&b[u+1][v-1])||(u+1&&b[u][v])||(u&&v&&b[u+1][v-1])) return false;
	}
	if(v+3==vv){
		if(b[u][v+1]||(v+1&&b[u-1][v])||(u-1&&b[u-2][v+1])||(u-1&&v+1&&b[u-1][v])) return false;
	}
	if(vv+3==v){
		if(b[u][v-1]||(v-1&&b[u-1][v-2])||(u-1&&b[u-2][v-1])||(u-1&&v-1&&b[u-1][v-2])) return false;
	}
	return true;
}
void r(int uu,int vv,int ww,int u,int v,int w){
	s[u][v][w]=s[uu][vv][ww]+1;
	q.push({u,v,w});
}
int main(){
	memset(s,0x3f,sizeof s);
	scanf("%d %d",&n,&m);
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			scanf("%d",&b[i][j]);
		}
	}
	int ax,ay,bx,by,l;
	char c;
	scanf("%d %d %d %d %c",&ax,&ay,&bx,&by,&c);
	switch(c){
		case 'E':l=0;break;
		case 'S':l=1;break;
		case 'W':l=2;break;
		case 'N':l=3;break;
	}
	q.push({ax,ay,l});
	s[ax][ay][l]=0;
	while(q.size()){
		S p=q.front();
		q.pop();
		int u=p.x,v=p.y,w=p.z;
		if(e(u,v,w,u,v,(w+1)%4)){
			r(u,v,w,u,v,(w+1)%4);
		}
		if(e(u,v,w,u,v,(w+3)%4)){
			r(u,v,w,u,v,(w+3)%4);
		}
		switch(w){
			case 0:if(e(u,v,w,u,v+1,w)) r(u,v,w,u,v+1,w);if(e(u,v,w,u,v+2,w)) r(u,v,w,u,v+2,w);if(e(u,v,w,u,v+3,w)) r(u,v,w,u,v+3,w);break;
			case 1:if(e(u,v,w,u+1,v,w)) r(u,v,w,u+1,v,w);if(e(u,v,w,u+2,v,w)) r(u,v,w,u+2,v,w);if(e(u,v,w,u+3,v,w)) r(u,v,w,u+3,v,w);break;
			case 2:if(e(u,v,w,u,v-1,w)) r(u,v,w,u,v-1,w);if(e(u,v,w,u,v-2,w)) r(u,v,w,u,v-2,w);if(e(u,v,w,u,v-3,w)) r(u,v,w,u,v-3,w);break;
			case 3:if(e(u,v,w,u-1,v,w)) r(u,v,w,u-1,v,w);if(e(u,v,w,u-2,v,w)) r(u,v,w,u-2,v,w);if(e(u,v,w,u-3,v,w)) r(u,v,w,u-3,v,w);break;
		}
	}
	int r=min({s[bx][by][0],s[bx][by][1],s[bx][by][2],s[bx][by][3]});
	if(r>1000000000) printf("-1");
	else printf("%d",r);
	// for(int i=0;i<=n;i++){
		// for(int j=0;j<=m;j++){
			// for(int k=0;k<4;k++){
				// cout<<s[i][j][k]<<' ';
			// }
			// cout<<'|';
		// }
		// cout<<"\n";
	// }
	return 0;
}
2023/8/25 21:38
加载中...