涉及算法:dfs
题目大意:给定一个矩形的区域,该区域由空白区域和障碍组成,给定起始点和终点,问将一颗石头从起点移动到终点最少需要多少步?
注意:
石头只能往上下左右四个方向移动,不能往对角线方向移动
你往任意一个方向仍出石头,它都会滑动,除非它还没有移动就遇到了障碍物
石头一旦扔出去,只有在以下几种情况下才会停下来
1、撞击到障碍物(此时障碍物会消失,石头会停在障碍物前面)
2、石头滑出了矩形区域(游戏失败)
3、石块到达了终点(游戏完成)
若大于10步还未到达终点,则游戏失败
代码如下:
import java.util.Scanner;
public class Main_3009_1
{
static int w;//w列
static int h;//h行
static int mesh[][];//mesh[i][j]:i行j列
static int d[][]={{-1,0},{1,0},{0,-1},{0,1}};
static int steps;
public static void main(String[] args)
{
int startx=0;
int starty=0;
Scanner in=new Scanner(System.in);
w=in.nextInt();
h=in.nextInt();
while(w!=0 && h!=0)
{
mesh=new int[h][w];
steps=11;
for(int i=0;i<h;i++)
{
for(int j=0;j<w;j++)
{
mesh[i][j]=in.nextInt();
if(mesh[i][j]==2)
{
startx=i;
starty=j;
}
}
}
dfs(startx, starty, 0);
if(steps==11)
{
System.out.println(-1);
}
else
{
System.out.println(steps);
}
w=in.nextInt();
h=in.nextInt();
}
}
static void dfs(int x,int y,int step)//当前位置为x行y列
{
if(step+1>=steps)//剪枝
{
return;
}
for(int i=0;i<4;i++)
{
int dx=x;
int dy=y;
while(true)
{
dx+=d[i][0];
dy+=d[i][1];
if(dx<0 || dx>=h || dy<0 || dy>=w) break;
if(mesh[dx][dy]==3)
{
steps=step+1;
return;
}
else if (mesh[dx][dy]==1)
{
if(dx-d[i][0]!=x || dy-d[i][1]!=y)
{
mesh[dx][dy]=0;
dfs(dx-d[i][0], dy-d[i][1], step+1);
mesh[dx][dy]=1;
}
break;
}
}
}
}
}