poj3009
2016-03-07 15:14
363 查看
涉及算法:dfs
题目大意:给定一个矩形的区域,该区域由空白区域和障碍组成,给定起始点和终点,问将一颗石头从起点移动到终点最少需要多少步?
注意:
石头只能往上下左右四个方向移动,不能往对角线方向移动
你往任意一个方向仍出石头,它都会滑动,除非它还没有移动就遇到了障碍物
石头一旦扔出去,只有在以下几种情况下才会停下来
1、撞击到障碍物(此时障碍物会消失,石头会停在障碍物前面)
2、石头滑出了矩形区域(游戏失败)
3、石块到达了终点(游戏完成)
若大于10步还未到达终点,则游戏失败
代码如下:
题目大意:给定一个矩形的区域,该区域由空白区域和障碍组成,给定起始点和终点,问将一颗石头从起点移动到终点最少需要多少步?
注意:
石头只能往上下左右四个方向移动,不能往对角线方向移动
你往任意一个方向仍出石头,它都会滑动,除非它还没有移动就遇到了障碍物
石头一旦扔出去,只有在以下几种情况下才会停下来
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; } } } } }
相关文章推荐
- 排序算法小结(C#)
- 整数划分问题--递归求解 例题:HDU 1028
- 搭建gitolite实现自动发布代码
- poj1129
- Apache Shiro 使用手册(三)Shiro 授权
- iOS开发---在 iOS 应用中直接跳转到 AppStore 的方法
- C++函数的重载、内联和默认参数
- Mahout-distrubution-0.9安装教程
- 宝典练习2之求两个数组的交集
- iOS CAShaperLayer 层详解
- Java内部类
- C++矩阵运算库推荐
- Android命名规范
- webstorm 高亮显示某一种类型文件
- 互联网环境下服务提供的模式
- JavaScript之变量、作用域
- 属于你的第一个Java程序
- PHP常用函数收藏
- dump_stack( )
- Android编程使用HTTP协议与TCP协议实现上传文件的方法