回家--搜索--dfs

版权声明:转载请附上地址 https://blog.csdn.net/weixin_44574520/article/details/89602158

luogu 2802

在这里插入图片描述

Code

#include <bits/stdc++.h>
using namespace std;

int n,m,a[15][15],vis[15][15];
int sx,sy;
int ans,pd;

inline void init_() {
	freopen("a.txt","r",stdin);
}

inline int read_() {
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9') {
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9') {
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}

inline void readda_() {
	memset(a,0,sizeof(a));
	n=read_();m=read_();
	for(int i=1;i<=n;i++) {
		for(int j=1;j<=m;j++) {
			a[i][j]=read_();
			if(a[i][j]==2) {
				sx=i;sy=j;
			}
		}
	}
}

inline void dfs_(int x,int y,int k,int blood) {
	if(x<1||y<1||x>n||y>m) return;
	if(blood<=0) return;
	if(!a[x][y]) return;
	if(k>=ans) return;
	if(a[x][y]==3) {
		ans=min(ans,k);
		pd=1;
		return;
	}
	if(a[x][y]==4) blood=6;
	if(!vis[x+1][y]&&a[x+1][y]!=0) { vis[x+1][y]=1;dfs_(x+1,y,k+1,blood-1);vis[x+1][y]=0; }
	if(!vis[x-1][y]&&a[x-1][y]!=0) { vis[x-1][y]=1;dfs_(x-1,y,k+1,blood-1);vis[x-1][y]=0; }
	if(!vis[x][y+1]&&a[x][y+1]!=0) { vis[x][y+1]=1;dfs_(x,y+1,k+1,blood-1);vis[x][y+1]=0; }
	if(!vis[x][y-1]&&a[x][y-1]!=0) { vis[x][y-1]=1;dfs_(x,y-1,k+1,blood-1);vis[x][y-1]=0; }
}

inline void work_() {
	memset(vis,0,sizeof(vis));
	ans=999999;pd=0;
	vis[sx][sy]=1;
	dfs_(sx,sy,0,6);
	if(!pd) printf("-1");
	else printf("%d",ans);
}

int main() {
	init_();
	readda_();
	work_();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44574520/article/details/89602158