RE怎么办,感觉数组开得已经足够了
查看原帖
RE怎么办,感觉数组开得已经足够了
199186
SnowLin楼主2022/7/12 20:13

代码如下,大佬帮帮org

#include<bits/stdc++.h>
using namespace std;
int n,m,a,b,c,d;
char di;
int f[155][155];
int p[120005][5];
char pp[1200005][5];
int w[105][105][105];
void bfs(int x,int y){
	p[1][0]=x;
	p[1][1]=y;
	pp[1][2]=di;
	p[1][3]=0;
	int t=1,h=1;
	while(h<=t){
		//
		//cout<<p[h][3]<<":"<<p[h][0]<<" "<<p[h][1]<<" "<<pp[h][2]<<endl;
		//
		if(pp[h][2]=='N') 
		    for(int j=1;j<=3;j++) {
		    	if(f[p[h][0]-j][p[h][1]]==1) break;
		        if(p[h][0]-j>=2&&w[p[h][0]-j][p[h][1]]['N'-'0']==0){
		        	t++;
		        	p[t][0]=p[h][0]-j;
		        	p[t][1]=p[h][1];
		        	pp[t][2]='N';
		        	p[t][3]=p[h][3]+1;
		        	w[p[h][0]-j][p[h][2]]['N'-'0']=1;
		        	if(p[t][0]==c+1&&p[t][1]==d+1) {
		        		printf("%d",p[t][3]);
		        		exit(0);
					}
				}
			}
		if(pp[h][2]=='S') 
		    for(int j=1;j<=3;j++) {
		        if(f[p[h][0]+j][p[h][1]]==1) break;
		        if(p[h][0]+j<=n&&w[p[h][0]+j][p[h][1]]['S'-'0']==0){
		        	t++;
		        	p[t][0]=p[h][0]+j;
		        	p[t][1]=p[h][1];
		        	pp[t][2]='S';
		        	p[t][3]=p[h][3]+1;
		        	w[p[h][0]+j][p[h][2]]['S'-'0']=1;
		        	if(p[t][0]==c+1&&p[t][1]==d+1) {
		        		printf("%d",p[t][3]);
		        		exit(0);
					}
				}
			}
		if(pp[h][2]=='E') 
		    for(int j=1;j<=3;j++){
		    	if(f[p[h][0]][p[h][1]+j]==1) break;
		        if(p[h][1]+j<=m&&w[p[h][0]][p[h][1]+j]['E'-'0']==0){
		        	t++;
		        	p[t][0]=p[h][0];
		        	p[t][1]=p[h][1]+j;
		        	pp[t][2]='E';
		        	p[t][3]=p[h][3]+1;
		        	w[p[h][0]][p[h][1]+j]['E'-'0']=1;
		        	if(p[t][0]==c+1&&p[t][1]==d+1) {
		        		printf("%d",p[t][3]);
		        		exit(0);
					}
				}
			}
		if(pp[h][2]=='W') 
		    for(int j=1;j<=3;j++) {
		    	if(f[p[h][0]][p[h][1]-j]==1) break;
		        if(p[h][1]-j>=2&&w[p[h][0]][p[h][1]-j]['W'-'0']==0){
		        	t++;
		        	p[t][0]=p[h][0];
		        	p[t][1]=p[h][1]-j;
		        	pp[t][2]='E';
		        	p[t][3]=p[h][3]+1;
		        	w[p[h][0]][p[h][1]-j]['W'-'0']=1;
		        	if(p[t][0]==c+1&&p[t][1]==d+1) {
		        		printf("%d",p[t][3]);
		        		exit(0);
					}
				}
			}
		if(pp[h][2]=='N'||pp[h][2]=='S') {
			if(w[p[h][0]][p[h][1]]['E'-'0']==0){
				t++;
			    p[t][0]=p[h][0];
			    p[t][1]=p[h][1];
			    pp[t][2]='E';
		        p[t][3]=p[h][3]+1;
		        w[p[h][0]][p[h][1]]['E'-'0']=1;
			}
			if(w[p[h][0]][p[h][1]]['W'-'0']==0){
				t++;
			    p[t][0]=p[h][0];
			    p[t][1]=p[h][1];
			    pp[t][2]='W';
		        p[t][3]=p[h][3]+1;
		        w[p[h][0]][p[h][1]]['W'-'0']=1;
			}   
		}
		if(pp[h][2]=='W'||pp[h][2]=='E') {
			if(w[p[h][0]][p[h][1]]['N'-'0']==0){
				t++;
			    p[t][0]=p[h][0];
			    p[t][1]=p[h][1];
			    pp[t][2]='N';
		        p[t][3]=p[h][3]+1;
		        w[p[h][0]][p[h][1]]['N'-'0']=1;
			}
			if(w[p[h][0]][p[h][1]]['S'-'0']==0){
				t++;
			    p[t][0]=p[h][0];
			    p[t][1]=p[h][1];
			    pp[t][2]='S';
		        p[t][3]=p[h][3]+1;
		        w[p[h][0]][p[h][1]]['S'-'0']=1;
			} 
		}
		h++;
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	    for(int j=1;j<=m;j++){
	    	int yy;
	    	scanf("%d",&yy);
	    	if(yy==1)
	    		f[i][j]=f[i][j+1]=f[i+1][j]=f[i+1][j+1]=1;
		}
	        
	scanf("%d%d%d%d",&a,&b,&c,&d);
	cin>>di;
	if(a==c&&b==d) {
		printf("0");
		return 0;
	}
	w[a][b][di-'0']=1;
	bfs(a+1,b+1);
	printf("-1");
} 
2022/7/12 20:13
加载中...