版权声明:转载请附上地址 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;
}