您的位置:首页 > 其它

poj3009

2016-03-07 15:14 363 查看
涉及算法: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;
}
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: