求助求助
查看原帖
求助求助
330026
wmq2006楼主2020/7/23 22:54
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdio>

using namespace std;
queue<int>qx,qy,qz;//上是1,右是2,下是3,左是4
int b[101][101],a[101][101]={0},f[101][101]={0},n,m,sx,sy,ex,ey;
char c;
string s;
int main(){
	//freopen("bird.in","r",stdin);
	//freopen("bird.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>b[i][j];
			if(b[i][j]==1){
				a[i+1][j+1]=1,a[i][j+1]=1,a[i+1][j]=1,a[i][j]=1;
			}
		}
	}
	for(int i=1;i<=n+1;i++){
		for(int j=1;j<=m+1;j++){
			f[i][j]=1e9;
		}
	}
	cin>>sx>>sy>>ex>>ey>>c;
	sx+=1,sy+=1,ex+=1,ey+=1;
	f[sx][sy]=0;
	qx.push(sx),qy.push(sy);
	if(c=='N')qz.push(1);
	if(c=='E')qz.push(2);
	if(c=='S')qz.push(3);
	if(c=='W')qz.push(4);
	while(qx.empty()==0){
		int fx=qx.front(),fy=qy.front(),fz=qz.front();
		int t=f[fx][fy];
		if(fx==6&&fy==5)cout<<t<<endl;
		qx.pop(),qy.pop(),qz.pop();
		if(fz==1){
			if(a[fx-1][fy]==0&&fx>1){
				if(t+1<f[fx-1][fy])f[fx-1][fy]=t+1,qx.push(fx-1),qy.push(fy),qz.push(1);
			}
			if(a[fx-2][fy]==0&&fx>2){
				if(t+1<f[fx-2][fy])f[fx-2][fy]=t+1,qx.push(fx-2),qy.push(fy),qz.push(1);
			}
			if(a[fx-3][fy]==0&&fx>3){
				if(t+1<f[fx-3][fy])f[fx-3][fy]=t+1,qx.push(fx-3),qy.push(fy),qz.push(1);
			}
			if(a[fx][fy-1]==0&&fy>1){
				if(t+2<f[fx][fy-1])f[fx][fy-1]=t+2,qx.push(fx),qy.push(fy-1),qz.push(4);
			}
			if(a[fx][fy-2]==0&&fy>2){
				if(t+2<f[fx][fy-2])f[fx][fy-2]=t+2,qx.push(fx),qy.push(fy-2),qz.push(4);
			}
			if(a[fx][fy-3]==0&&fy>3){
				if(t+2<f[fx][fy-3])f[fx][fy-3]=t+2,qx.push(fx),qy.push(fy-3),qz.push(4);
			}
			if(a[fx][fy+1]==0&&fy+1<=m+1){
				if(t+2<f[fx][fy+1])f[fx][fy+1]=t+2,qx.push(fx),qy.push(fy+1),qz.push(2);
			}
			if(a[fx][fy+2]==0&&fy+2<=m+1){
				if(t+2<f[fx][fy+2])f[fx][fy+2]=t+2,qx.push(fx),qy.push(fy+2),qz.push(2);
			}
			if(a[fx][fy+3]==0&&fy+3<=m+1){
				if(t+2<f[fx][fy+3])f[fx][fy+3]=t+2,qx.push(fx),qy.push(fy+3),qz.push(2);
			}
			if(a[fx+1][fy]==0&&fx+1<=n+1){
				if(t+3<f[fx+1][fy])f[fx+1][fy]=t+3,qx.push(fx+1),qy.push(fy),qz.push(3);
			}
			if(a[fx+2][fy]==0&&fx+2<=n+1){
				if(t+3<f[fx+2][fy])f[fx+2][fy]=t+3,qx.push(fx+2),qy.push(fy),qz.push(3);
			}
			if(a[fx+3][fy]==0&&fx+3<=n+1){
				if(t+3<f[fx+3][fy])f[fx+3][fy]=t+3,qx.push(fx+3),qy.push(fy),qz.push(3);
			}
		}
		if(fz==2){
			if(a[fx][fy+1]==0&&fy+1<=m+1){
				if(t+1<f[fx][fy+1])f[fx][fy+1]=t+1,qx.push(fx),qy.push(fy+1),qz.push(2);
			}
			if(a[fx][fy+2]==0&&fy+2<=m+1){
				if(t+1<f[fx][fy+2])f[fx][fy+2]=t+1,qx.push(fx),qy.push(fy+2),qz.push(2);
			}
			if(a[fx][fy+3]==0&&fy+3<=m+1){
				if(t+1<f[fx][fy+3])f[fx][fy+3]=t+1,qx.push(fx),qy.push(fy+3),qz.push(2);
			}
			if(a[fx-1][fy]==0&&fx>1){
				if(t+2<f[fx-1][fy])f[fx-1][fy]=t+2,qx.push(fx-1),qy.push(fy),qz.push(1);
			}
			if(a[fx-2][fy]==0&&fx>2){
				if(t+2<f[fx-2][fy])f[fx-2][fy]=t+2,qx.push(fx-2),qy.push(fy),qz.push(1);
			}
			if(a[fx-3][fy]==0&&fx>3){
				if(t+2<f[fx-3][fy])f[fx-3][fy]=t+2,qx.push(fx-3),qy.push(fy),qz.push(1);
			}
			if(a[fx+1][fy]==0&&fx+1<=n+1){
				if(t+2<f[fx+1][fy])f[fx+1][fy]=t+2,qx.push(fx+1),qy.push(fy),qz.push(3);
			}
			if(a[fx+2][fy]==0&&fx+2<=n+1){
				if(t+2<f[fx+2][fy])f[fx+2][fy]=t+2,qx.push(fx+2),qy.push(fy),qz.push(3);
			}
			if(a[fx+3][fy]==0&&fx+3<=n+1){
				if(t+2<f[fx+3][fy])f[fx+3][fy]=t+2,qx.push(fx+3),qy.push(fy),qz.push(3);
			}
			if(a[fx][fy-1]==0&&fy>1){
				if(t+3<f[fx][fy-1])f[fx][fy-1]=t+3,qx.push(fx),qy.push(fy-1),qz.push(4);
			}
			if(a[fx][fy-2]==0&&fy>2){
				if(t+3<f[fx][fy-2])f[fx][fy-2]=t+3,qx.push(fx),qy.push(fy-2),qz.push(4);
			}
			if(a[fx][fy-3]==0&&fy>3){
				if(t+3<f[fx][fy-3])f[fx][fy-3]=t+3,qx.push(fx),qy.push(fy-3),qz.push(4);
			}
		}
		if(fz==3){
			if(a[fx+1][fy]==0&&fx+1<=n+1){
				if(t+1<f[fx+1][fy])f[fx+1][fy]=t+1,qx.push(fx+1),qy.push(fy),qz.push(3);
			}
			if(a[fx+2][fy]==0&&fx+2<=n+1){
				if(t+1<f[fx+2][fy])f[fx+2][fy]=t+1,qx.push(fx+2),qy.push(fy),qz.push(3);
			}
			if(a[fx+3][fy]==0&&fx+3<=n+1){
				if(t+1<f[fx+3][fy])f[fx+3][fy]=t+1,qx.push(fx+3),qy.push(fy),qz.push(3);
			}
			if(a[fx][fy-1]==0&&fy>1){
				if(t+2<f[fx][fy-1])f[fx][fy-1]=t+2,qx.push(fx),qy.push(fy-1),qz.push(4);
			}
			if(a[fx][fy-2]==0&&fy>2){
				if(t+2<f[fx][fy-2])f[fx][fy-2]=t+2,qx.push(fx),qy.push(fy-2),qz.push(4);
			}
			if(a[fx][fy-3]==0&&fy>3){
				if(t+2<f[fx][fy-3])f[fx][fy-3]=t+2,qx.push(fx),qy.push(fy-3),qz.push(4);
			}
			if(a[fx][fy+1]==0&&fy+1<=m+1){
				if(t+2<f[fx][fy+1])f[fx][fy+1]=t+2,qx.push(fx),qy.push(fy+1),qz.push(2);
			}
			if(a[fx][fy+2]==0&&fy+2<=m+1){
				if(t+2<f[fx][fy+2])f[fx][fy+2]=t+2,qx.push(fx),qy.push(fy+2),qz.push(2);
			}
			if(a[fx][fy+3]==0&&fy+3<=m+1){
				if(t+2<f[fx][fy+3])f[fx][fy+3]=t+2,qx.push(fx),qy.push(fy+3),qz.push(2);
			}
			if(a[fx-1][fy]==0&&fx>1){
				if(t+3<f[fx-1][fy])f[fx-1][fy]=t+3,qx.push(fx-1),qy.push(fy),qz.push(1);
			}
			if(a[fx-2][fy]==0&&fx>2){
				if(t+3<f[fx-2][fy])f[fx-2][fy]=t+3,qx.push(fx-2),qy.push(fy),qz.push(1);
			}
			if(a[fx-3][fy]==0&&fx>3){
				if(t+3<f[fx-3][fy])f[fx-3][fy]=t+3,qx.push(fx-3),qy.push(fy),qz.push(1);
			}
		}
		if(fz==4){
			if(a[fx][fy-1]==0&&fy>1){
				if(t+1<f[fx][fy-1])f[fx][fy-1]=t+1,qx.push(fx),qy.push(fy-1),qz.push(4);
			}
			if(a[fx][fy-2]==0&&fy>2){
				if(t+1<f[fx][fy-2])f[fx][fy-2]=t+1,qx.push(fx),qy.push(fy-2),qz.push(4);
			}
			if(a[fx][fy-3]==0&&fy>3){
				if(t+1<f[fx][fy-3])f[fx][fy-3]=t+1,qx.push(fx),qy.push(fy-3),qz.push(4);
			}
			if(a[fx-1][fy]==0&&fx>1){
				if(t+2<f[fx-1][fy])f[fx-1][fy]=t+2,qx.push(fx-1),qy.push(fy),qz.push(1);
			}
			if(a[fx-2][fy]==0&&fx>2){
				if(t+2<f[fx-2][fy])f[fx-2][fy]=t+2,qx.push(fx-2),qy.push(fy),qz.push(1);
			}
			if(a[fx-3][fy]==0&&fx>3){
				if(t+2<f[fx-3][fy])f[fx-3][fy]=t+2,qx.push(fx-3),qy.push(fy),qz.push(1);
			}
			if(a[fx+1][fy]==0&&fx+1<=n+1){
				if(t+2<f[fx+1][fy])f[fx+1][fy]=t+2,qx.push(fx+1),qy.push(fy),qz.push(3);
			}
			if(a[fx+2][fy]==0&&fx+2<=n+1){
				if(t+2<f[fx+2][fy])f[fx+2][fy]=t+2,qx.push(fx+2),qy.push(fy),qz.push(3);
			}
			if(a[fx+3][fy]==0&&fx+3<=n+1){
				if(t+2<f[fx+3][fy])f[fx+3][fy]=t+2,qx.push(fx+3),qy.push(fy),qz.push(3);
			}
			if(a[fx][fy+1]==0&&fy+1<=m+1){
				if(t+3<f[fx][fy+1])f[fx][fy+1]=t+3,qx.push(fx),qy.push(fy+1),qz.push(2);
			}
			if(a[fx][fy+2]==0&&fy+2<=m+1){
				if(t+3<f[fx][fy+2])f[fx][fy+2]=t+3,qx.push(fx),qy.push(fy+2),qz.push(2);
			}
			if(a[fx][fy+3]==0&&fy+3<=m+1){
				if(t+3<f[fx][fy+3])f[fx][fy+3]=t+3,qx.push(fx),qy.push(fy+3),qz.push(2);
			}
		}
	}
	for(int i=1;i<=n+1;i++){
		for(int j=1;j<=m+1;j++){
			if(f[i][j]==1e9)cout<<-1<<" ";
			else cout<<f[i][j]<<" ";
		}
		cout<<endl;
	}
	return 0;
}
2020/7/23 22:54
加载中...