http://poj.org/problem?id=3009

模拟冰壶的移动,给出到达终点的最少投掷次数(不可达时为-1)。

具体移动规则如下:

每次选四个方向之一,沿此方向一直前进,直到撞到block或出界或抵达目标位置。

  如果撞到block,冰壶停在block的前一个位置,block消失,此时可改变冰壶的移动方向(重新投掷一次);

  如果出界,则这条移动路径以失败结束;

  如果抵达目标位置,则记录这条移动路径一共投掷的次数。

投掷次数不超过10次的为成功路径。

如果存在成功路径,输出最少的投掷次数;不存在则输出-1。

代码如下,由于数据量小,可用DFS得到所有解然后取最小值;注意回溯时还原修改过的block:

  1. #include <cstdio>
  2. #include <cstring>
  3. using namespace std;
  4.  
  5. const int MAX_N = ;
  6.  
  7. int n, m;
  8. int G[MAX_N][MAX_N];
  9. int dx[]={, , ,-}, dy[]={, -, , };
  10. int sx, sy, gx, gy;
  11. int min_ans;
  12.  
  13. bool inside(int x, int y){
  14. if(x< || x>=n || y< || y>=m) return false;
  15. return true;
  16. }
  17.  
  18. void dfs(int x, int y, int cnt){
  19. if(cnt > ) return ;
  20. for(int i=; i<; i++){
  21. int nx = x + dx[i];
  22. int ny = y + dy[i];
  23. if(!inside(x, y)) continue; //出界
  24. if(G[nx][ny] == ) continue; //block
  25. else{
  26. while(inside(nx, ny) && G[nx][ny] != && G[nx][ny] != ){
  27. nx += dx[i];
  28. ny += dy[i]; //沿此方向走到block为止
  29. }
  30. if(!inside(nx, ny)) continue; //此方向最终出界
  31. if(G[nx][ny] == ){
  32. min_ans = cnt<min_ans ? cnt : min_ans;
  33. continue; //此方向中途命中
  34. }
  35.  
  36. G[nx][ny] = ; //block消失
  37. nx -= dx[i];
  38. ny -= dy[i]; //抵达此方向最后一个合法位置,block的前一个
  39. //printf("%d %d\n", dx[i], dy[i]);
  40. dfs(nx, ny, cnt+);
  41. nx += dx[i];
  42. ny += dy[i];
  43. G[nx][ny] = ; //还原,回溯
  44. }
  45. }
  46. return ;
  47. }
  48.  
  49. int main()
  50. {
  51. freopen("3009.txt", "r", stdin);
  52. while(scanf("%d%d", &m, &n) != EOF){
  53. if(m== && n==) break;
  54. for(int i=; i<n; i++){
  55. for(int j=; j<m; j++){
  56. scanf("%d", &G[i][j]);
  57. if(G[i][j] == ){
  58. sx = i;
  59. sy = j;
  60. }else if(G[i][j] == ){
  61. gx = i;
  62. gy = j;
  63. }
  64. }
  65. }
  66.  
  67. min_ans = ; //任意大于10的值
  68. dfs(sx, sy, ); //投掷第一次
  69. if(min_ans > ) min_ans = -;
  70. printf("%d\n", min_ans);
  71. }
  72. return ;
  73. }

注意记这一类搜索的框架,以及联系算法课学过的回溯法的基本概念,如约束条件、活结点等。

【POJ 3009 Curling2.0 迷宫寻径 DFS】的更多相关文章

  1. POJ 3009 Curling 2.0【带回溯DFS】

    POJ 3009 题意: 给出一个w*h的地图,其中0代表空地,1代表障碍物,2代表起点,3代表终点,每次行动可以走多个方格,每次只能向附近一格不是障碍物的方向行动,直到碰到障碍物才停下来,此时障碍物 ...

  2. POJ 3009 Curling 2.0 {深度优先搜索}

    原题 $On Planet MM-21, after their Olympic games this year, curling is getting popular. But the rules ...

  3. POJ 3009:Curling 2.0 推箱子

    Curling 2.0 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14090   Accepted: 5887 Desc ...

  4. 2021.08.16 P1363 幻象迷宫(dfs,我感受到了出题人浓浓的恶意)

    2021.08.16 P1363 幻象迷宫(dfs,我感受到了出题人浓浓的恶意) P1363 幻象迷宫 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 幻象迷宫可以认为是无限 ...

  5. POJ 1979 Red and Black【DFS】

    标准DFS,统计遍历过程中遇到的黑点个数 #include<cstdio> #include<vector> #include<queue> #include< ...

  6. poj 1724 ROADS 很水的dfs

    题意:给你N个城市和M条路和K块钱,每条路有话费,问你从1走到N的在K块钱内所能走的最短距离是多少 链接:http://poj.org/problem?id=1724 直接dfs搜一遍就是 代码: # ...

  7. POJ 1745 【0/1 背包】

    题目链接:http://poj.org/problem?id=1745 Divisibility Time Limit: 1000MS   Memory Limit: 10000K Total Sub ...

  8. POJ 3009 Curling 2.0(DFS + 模拟)

    题目链接:http://poj.org/problem?id=3009 题意: 题目很复杂,直接抽象化解释了.给你一个w * h的矩形格子,其中有包含一个数字“2”和一个数字“3”,剩下的格子由“0” ...

  9. POJ 3009 Curling 2.0 回溯,dfs 难度:0

    http://poj.org/problem?id=3009 如果目前起点紧挨着终点,可以直接向终点滚(终点不算障碍) #include <cstdio> #include <cst ...

随机推荐

  1. Unique Binary Search Trees 解答

    Question Given n, how many structurally unique BST's (binary search trees) that store values 1...n? ...

  2. Unique Paths 解答

    Question A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram be ...

  3. iOS蓝牙4.0开发例子

    1建立中心角色 1 2 3 #import <CoreBluetooth/CoreBluetooth.h>  CBCentralManager *manager;  manager = [ ...

  4. java学习笔记day06---匿名内部类

    1.匿名内部类:其实就是内部类的简化形式,它所体现的就是一个类或者接口的子类对象.前提:     内部类必须继承或实现外部类或接口. 格式:    new 父类&接口(){};    其实就是 ...

  5. 将json格式日期(毫秒数)转成日常日期格式和日常格式时间对比

    第一:是把生成的Json格式的时间转换,注意要看清楚时间的格式 function (cellval) { var date = new Date(parseInt(cellval.replace(&q ...

  6. android如何调用显示和隐藏系统默认的输入法(一)

    1.调用显示系统默认的输入法 方法一. InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_MET ...

  7. sql server保留小数解决方法

    在数据库中,我们有时会用到小数,怎样在数据库中转化小数呢,下面是一些常用的方法. 1.使用Round(字段名/数字,小数保留位数)方法,如下所示: select Round(3.333,2) 结果如下 ...

  8. stuts1:(Struts)Action类及其相关类

    org.apache.struts.action.Action类是Struts的心脏,也是客户请求和业务操作间的桥梁.每个Action类通常设计为代替客户完成某种操作.一旦正确的Action实例确定, ...

  9. python基础之 list和 tuple(元组)

    list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示: >>> ...

  10. HDU 1057 - A New Growth Industry

    简单的模拟. 给定天数n,给定D[0]~D[15]给定一个20*20的矩阵.每个格子内有一个0~3的数字,表示细菌数.每天,每个格子将加上D[k],k表示这个格子以及上下左右相邻格子的细菌之和(矩阵外 ...