dfs,,可是明知道是dfs还是不会做=-=。。。。
题目大意,,在一张板上,从s处开始击球,方向仅限于上下左右,球只要撞击到墙壁(用1表示)球就会静止下来,同时墙壁会碎掉,变为0(用0表示空),求问经过最少几次击球能到达g(目标)。
击球的时候要注意几点:
1.球只会撞到墙或到达g点会停下来;
2.不能向边上有墙壁的方向击球;
题目意思是不是挺简单的呀?可就是做不出,还是看了题解才有思路,出处点击打开链接
#include <iostream>
#include <stdio.h>
#define inf 0x3f3f3f3f
#define M 1008
using namespace std;
int map[M][M];
int dir[4][2]={{1,0},{-1,0},{0,-1},{0,1}};
int w,h;
bool flag=false;
int min_step;
void dfs(int x,int y,int step)
{
if(step>=10)
return ;
int xx,yy;
for(int i=0;i<4;i++)
{
xx=x+dir[i][0];
yy=y+dir[i][1];
if(xx<1||xx>h||yy<1||yy>w)
continue ;
if(map[xx][yy]==1)
continue ;
while(map[xx][yy]!=1&&map[xx][yy]!=3)
{
xx+=dir[i][0];
yy+=dir[i][1];
if(xx<1||xx>h||yy<1||yy>w)
break;
}
if(xx<1||xx>h||yy<1||yy>w)
continue ;
if(map[xx][yy]==3)
{
min_step=min(min_step,step+1);
return ;
}
else
{
map[xx][yy]=0;
dfs(xx-dir[i][0],yy-dir[i][1],step+1);
map[xx][yy]=1;
}
}
}
int main()
{
freopen("in.txt","r",stdin);
while(scanf("%d%d",&w,&h),w)
{
min_step=inf;
int sx,sy,gx,gy;
for(int i=1;i<=h;i++)
{
for(int j=1;j<=w;j++)
{
scanf("%d",&map[i][j]);
if(map[i][j]==2)
{
sx=i;
sy=j;
}
else if(map[i][j]==3)
{
gx=i;
gy=j;
}
}
}
dfs(sx,sy,0);
if(min_step != inf) {
printf("%d\n", min_step);
}
else printf("-1\n");
}
return 0;
}
不过掌握了一点技巧了,就是如何在dfs里面求最小值,
就是下面的这些代码
if(map[xx][yy]==3)
{
min_step=min(min_step,step+1);
return ;
}
是不是很方便呀
其实还有一点我想说在循环方面我连while都忘记了。。。=-=
就是这几点了。。