题解 P2802 【回家(quan shui)】
深搜大法好!!!
看了看前辈和dalao的题解,总感觉判断条件上有点小繁琐。再加上坐旁边的大(di)神(di)都已经写了他们的第一篇题解,作为蒟蒻的我看了很羡(ji)慕(du),所以我也写(shui)一篇(bo)。
题目的大致意思就是一个被追着跑的亚索需要跑回泉水。
0=地形,1=路,2=开始的位置,3=泉水,4=小兵。
条件给的范围是[0,15],所以放心大胆的用(xiong)搜(qian)索(E)。
存储方式:map[N][N]存图,book[N][N]用来判断。
下面直接上代码。
#include<cstdio>
#define N 11
int stx,sty,enx,eny,map[N][N],book[N][N],n,m,min=9999999;
const int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
//分别向右、向下、向左、向上走
bool can;
//是否能到达
void dfs(int step,int x,int y,int remain)
{
int i,tx,ty;
if(remain==0)return;//血流完了
if(step>=min)return;//剪枝
if(x==enx&&y==eny){//到达目的地
if(min>step)min=step;//更新最小值
if(can==0)can=1;
return;
}
for(i=0;i<=3;i++){
//枚举各个方向
tx=x+next[i][0],ty=y+next[i][1];
if(tx<1||tx>n||ty<1||ty>m||map[tx][ty]==0)continue;
//不能走出地图也不能买挂变凯隐
if(book[tx][ty]==0){
book[tx][ty]=1;
if(map[tx][ty]==4&&remain>1)dfs(step+1,tx,ty,6);
//有小兵,往前E刷盾(注意remain>1,没死才能E!)
else dfs(step+1,tx,ty,remain-1);
//没小兵,继续用脚赶路
book[tx][ty]=0;
}
}
return;
}
int main()
{
int i,j;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){
scanf("%1d",&map[i][j]);
if(map[i][j]==2)stx=i,sty=j;
else if(map[i][j]==3)enx=i,eny=j;
}
book[stx][sty]=1;
dfs(0,stx,sty,6);
if(can)
printf("%d",min);
else
printf("-1");
return 0;
}