蒟蒻求助
查看原帖
蒟蒻求助
170410
向晚楼主2021/8/25 20:18

这道题本来是bfs但本蒟蒻对bfs实在是不熟悉
只好来打dfs了
有没有大佬帮帮我嘛

#include<iostream>
using namespace std;
int n,m,a,ans=1<<30,xc,yc,xm,ym;
bool flag[55][55];
bool foot[55][55];
int f[55][55];
char ff;
short m1[5]={0,-1,0,0,1};
short m2[5]={0,0,-1,1,0};
void dfs(int x,int y,int sum,int fx,int zg){
	if(x==xm&&y==ym){
		ans=min(ans,sum);
		return ;
	}
	if((f[x][y]!=0&&sum>=f[x][y])||sum>=ans) return ;
	f[x][y]=sum;
	for(int i=1;i<=4;i++){
		if(i==fx) continue;
		int mx=x+m1[i],my=y+m2[i];
		if(flag[mx][my]||flag[mx+1][my]||flag[mx][my+1]||flag[mx+1][my+1]) continue;
		if(mx<1||mx>n||my<1||my>m) continue;
		if(foot[mx][my]) continue;
		dfs(mx,my,sum+2,i,1);
	}
	int mx=x+m1[fx],my=y+m2[fx];
	if(flag[mx][my]||flag[mx+1][my]||flag[mx][my+1]||flag[mx+1][my+1]) return ;
	if(mx<1||mx>n||my<1||my>m) return ;
	if(foot[mx][my]) return ;
	foot[mx][my]=1;
	if(zg>=1&&zg<3) dfs(mx,my,sum,fx,zg+1);
	else dfs(mx,my,sum+1,fx,1);
	foot[mx][my]=0;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			cin>>a;
			flag[i][j]=a;
		}
	cin>>xc>>yc>>xm>>ym>>ff;
	if(ff=='E') dfs(xc,yc,0,3,0);
	else
	if(ff=='S') dfs(xc,yc,0,4,0);
	else
	if(ff=='W') dfs(xc,yc,0,2,0);
	else
	if(ff=='N') dfs(xc,yc,0,1,0);
	if(ans==1<<30) cout<<-1<<endl;
	else cout<<ans<<endl;
	return 0;
}
//东E,南S,西W,北N
2021/8/25 20:18
加载中...