这个题依然是一个DFS题,类似冰球。
其中注意的地方就是你撞击一个阻碍物需要停留在它前面,然后该阻碍物被你撞碎。求的为起点到终点的最小步数,不算难,直接贴代码。
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAX 21
using namespace std;
int map[MAX][MAX],sx,sy,ex,ey,w,h,ans;
int movex[4]={1,-1,0,0},movey[4]={0,0,1,-1};
bool isborder(int x,int y)
{
if(x<0||x>=h||y<0||y>=w)
return true;
return false;
}
void DFS(int x,int y,int cou)
{
if(cou>10||cou>ans)
return ;
for(int i=0;i<4;i++)
{
int itx=x+movex[i],ity=y+movey[i];
if(isborder(itx,ity)||map[itx][ity]==1)
continue;
while(1)
{
if(isborder(itx,ity))
break;
if(map[itx][ity]==0||map[itx][ity]==2)
{
itx+=movex[i];
ity+=movey[i];
continue;
}
if(map[itx][ity]==1)
{
map[itx][ity]=0;
DFS(itx-movex[i],ity-movey[i],cou+1);
map[itx][ity]=1;
break;
}
if(map[itx][ity]==3)
{
ans=min(ans,cou+1);
return ;
}
}
}
}
int main()
{
while(scanf("%d%d",&w,&h)!=EOF)
{
if(w+h==0)
break;
for(int i=0;i<h;i++)
for(int j=0;j<w;j++)
{
scanf("%d",&map[i][j]);
if(map[i][j]==2)
sx=i,sy=j;
else if(map[i][j]==3)
ex=i,ey=j;
}
ans=11;
DFS(sx,sy,0);
if(ans!=11)
printf("%d\n",ans);
else
printf("-1\n");
}
return 0;
}