一、题目

Description

On Planet MM-21, after their Olympic games this year, curling is getting popular. But the rules are somewhat different from ours. The game is played on an ice game board on which a square mesh is marked. They use only a single stone. The purpose of the game is to lead the stone from the start to the goal with the minimum number of moves.

Fig. 1 shows an example of a game board. Some squares may be occupied with blocks. There are two special squares namely the start and the goal, which are not occupied with blocks. (These two squares are distinct.) Once the stone begins to move, it will proceed until it hits a block. In order to bring the stone to the goal, you may have to stop the stone by hitting it against a block, and throw again.



Fig. 1: Example of board (S: start, G: goal)

The movement of the stone obeys the following rules:

  • At the beginning, the stone stands still at the start square.
  • The movements of the stone are restricted to x and y directions. Diagonal moves are prohibited.
  • When the stone stands still, you can make it moving by throwing it. You may throw it to any direction unless it is blocked immediately(Fig. 2(a)).
  • Once thrown, the stone keeps moving to the same direction until one of the following occurs:
    • The stone hits a block (Fig. 2(b), (c)).

      • The stone stops at the square next to the block it hit.
      • The block disappears.
    • The stone gets out of the board.
      • The game ends in failure.
    • The stone reaches the goal square.
      • The stone stops there and the game ends in success.
  • You cannot throw the stone more than 10 times in a game. If the stone does not reach the goal in 10 moves, the game ends in failure.



Fig. 2: Stone movements

Under the rules, we would like to know whether the stone at the start can reach the goal and, if yes, the minimum number of moves required.

With the initial configuration shown in Fig. 1, 4 moves are required to bring the stone from the start to the goal. The route is shown in Fig. 3(a). Notice when the stone reaches the goal, the board configuration has changed as in Fig. 3(b).



Fig. 3: The solution for Fig. D-1 and the final board configuration

Input

The input is a sequence of datasets. The end of the input is indicated by a line containing two zeros separated by a space. The number of datasets never exceeds 100.

Each dataset is formatted as follows.

the width(=w) and the height(=h) of the board

the width(=w) and the height(=h) of the board 

First row of the board

the width(=w) and the height(=h) of the board 

First row of the board 

...

the width(=w) and the height(=h) of the board 

First row of the board 

... 

h-th row of the board

The width and the height of the board satisfy: 2 <= w <= 20, 1 <= h <= 20.

Each line consists of w decimal numbers delimited by a space. The number describes the status of the corresponding square.

0 vacant square
1 block
2 start position
3 goal position

The dataset for Fig. D-1 is as follows:

6 6

6 6 

1 0 0 2 1 0

6 6 

1 0 0 2 1 0 

1 1 0 0 0 0

6 6 

1 0 0 2 1 0 

1 1 0 0 0 0 

0 0 0 0 0 3

6 6 

1 0 0 2 1 0 

1 1 0 0 0 0 

0 0 0 0 0 3 

0 0 0 0 0 0

6 6 

1 0 0 2 1 0 

1 1 0 0 0 0 

0 0 0 0 0 3 

0 0 0 0 0 0 

1 0 0 0 0 1

6 6 

1 0 0 2 1 0 

1 1 0 0 0 0 

0 0 0 0 0 3 

0 0 0 0 0 0 

1 0 0 0 0 1 

0 1 1 1 1 1

Output

For each dataset, print a line having a decimal integer indicating the minimum number of moves along a route from the start to the goal. If there are no such routes, print -1 instead. Each line should not have any character other than this number.

Sample Input

  1. 2 1
  2. 3 2
  3. 6 6
  4. 1 0 0 2 1 0
  5. 1 1 0 0 0 0
  6. 0 0 0 0 0 3
  7. 0 0 0 0 0 0
  8. 1 0 0 0 0 1
  9. 0 1 1 1 1 1
  10. 6 1
  11. 1 1 2 1 1 3
  12. 6 1
  13. 1 0 2 1 1 3
  14. 12 1
  15. 2 0 1 1 1 1 1 1 1 1 1 3
  16. 13 1
  17. 2 0 1 1 1 1 1 1 1 1 1 1 3
  18. 0 0

Sample Output

  1. 1
  2. 4
  3. -1
  4. 4
  5. 10
  6. -1

二、思路&心得

  • 利用深度搜索、回溯以及剪枝算法进行搜索

  • 算法编写时应注意:终止条件的判定、资源的还原(清空)以及相应的终止命令(return、break)

三、代码

  1. #include<stdio.h>
  2. #define VACANT 0
  3. #define BLOCK 1
  4. #define START 2
  5. #define GOAL 3
  6. #define MAX_TIMES 11
  7. int W, H;
  8. int sx, sy, gx, gy;
  9. int min, step;
  10. int map[25][25];
  11. int dirction[4][2] = {0, -1, -1, 0, 0, 1, 1, 0};
  12. void dfs(int x, int y) {
  13. if (step > 10 || step >= min) return;
  14. for (int i = 0; i < 4; i ++) {
  15. int tx = x, ty = y;
  16. while (1) {
  17. int px = tx, py = ty;
  18. tx += dirction[i][0], ty+= dirction[i][1];
  19. if (tx < 0 || tx >= H || ty < 0 || ty >= W) break;
  20. if (tx == gx && ty == gy) {
  21. step ++;
  22. if (step < min) min = step;
  23. step --;
  24. return;
  25. } else if (map[tx][ty] == BLOCK) {
  26. if (px != x || py != y) {
  27. map[tx][ty] = VACANT;
  28. step ++;
  29. dfs(px, py);
  30. map[tx][ty] = BLOCK;
  31. step --;
  32. }
  33. break;
  34. }
  35. }
  36. }
  37. }
  38. void solve() {
  39. min = MAX_TIMES;
  40. step = 0;
  41. for (int i = 0; i < H; i ++) {
  42. for (int j = 0; j < W; j ++) {
  43. scanf("%d", &map[i][j]);
  44. if (map[i][j] == START) {
  45. sx = i, sy = j;
  46. } else if (map[i][j] == GOAL) {
  47. gx = i, gy = j;
  48. }
  49. }
  50. }
  51. dfs(sx, sy);
  52. if (min == MAX_TIMES) printf("-1\n");
  53. else printf("%d\n", min);
  54. }
  55. int main() {
  56. while(scanf("%d %d", &W, &H)) {
  57. if (!W && !H) break;
  58. solve();
  59. }
  60. return 0;
  61. }

【搜索】POJ-3009 DFS+回溯的更多相关文章

  1. POJ 3414 dfs 回溯

    题目链接:http://poj.org/problem?id=3414 题意:三个值A, B, C, A和B是两个杯子的容量,问最短操作数使A或者B里的水量是C.有三种操作. 思路:dfs.暴力 很简 ...

  2. POJ 3009 DFS+剪枝

    POJ3009 DFS+剪枝 原题: Curling 2.0 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16280 Acce ...

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

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

  4. 【POJ - 3009】Curling 2.0 (dfs+回溯)

    -->Curling 2.0 直接上中文 Descriptions: 今年的奥运会之后,在行星mm-21上冰壶越来越受欢迎.但是规则和我们的有点不同.这个游戏是在一个冰游戏板上玩的,上面有一个正 ...

  5. [LeetCode] 79. 单词搜索(DFS,回溯)

    题目 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单元格 ...

  6. 【原创】poj ----- 3009 curling 2 解题报告

    题目地址: http://poj.org/problem?id=3009 题目内容: Curling 2.0 Time Limit: 1000MS   Memory Limit: 65536K Tot ...

  7. NOJ 1074 Hey Judge(DFS回溯)

    Problem 1074: Hey Judge Time Limits:  1000 MS   Memory Limits:  65536 KB 64-bit interger IO format: ...

  8. HDU 1016 Prime Ring Problem(经典DFS+回溯)

    Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  9. HDU 2181 哈密顿绕行世界问题(经典DFS+回溯)

    哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

随机推荐

  1. redis五种数据结构及使用场景

    string(字符串) 存储最简单的key-value结构. value可以是字符串.整数或者浮点数. 可以对整个字符串或者字符串的一部分执行操作: 对整数和浮点数执行自增或者自减操作. 使用场景: ...

  2. 调试大叔V2.1.0(2018.12.17)|http/s接口调试、数据分析程序员辅助开发神器

    2018.12.17 - 调试大叔 V2.1.0*升级http通讯协议版本,完美解决Set-Cookie引起的系列问题:*新增Content-Type编码格式参数,支持保存(解决模拟不同网站或手机请求 ...

  3. 如何防止网页被植入广告,内容被监控-HTTPS

    前几天一朋友说访问网站页面底部怎么出现小广告了呢,内容有点不雅,朋友截图发给我,调侃我说怎么放这种广告,我一听纳闷,网站运行伊始,从来没有投放过任何广告,更别说不雅广告了. 最近还遇到一个问题就是,网 ...

  4. GATK --- wdl 语言

    GATK的pipeline使用WDL进行编写 WDL是一种流程管理语言,内置的支持并行,适合编写pipeline 运行wdl脚本需要两步:第一步编辑参数列表对应的json文件,第二步直接运行Cromw ...

  5. Django model字段类型(转)

    AutoField     一个 IntegerField, 添加记录时它会自动增长. 你通常不需要直接使用这个字段; 如果你不指定主键的话,系统会自动添加一个主键字段到你的 model.(参阅 _自 ...

  6. 20155212 2016-2017-2 《Java程序设计》第9周学习总结

    20155212 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 Chapter16 数据库本身是个独立运行的应用程序. 应用程序如何呼叫这组链接库? 不同的 ...

  7. Hall定理

    Hall定理 Tags:图论 zybl 二分图\(G=<V1,V2,E>\)中,\(|V1|<|V2|\),当且仅当\(V1\)中任意\(k(=1,2,3..|V1|)\)个顶点都与 ...

  8. setInterval只执行一次的原因

    setInterval(arrow(),) 改为: setInterval(arrow,) 原因: arrow()这是一个函数调用,函数调用就会有返回值, 而arrow()没有返回值,所以这里的arr ...

  9. 【BZOJ 2132】圈地计划 && 【7.22Test】计划

    两种版本的题面 Description 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地.据了解,这块土 ...

  10. python赋值、浅拷贝、深拷贝区别

    在写Python过程中,经常会遇到对象的拷贝,如果不理解浅拷贝和深拷贝的概念,你的代码就可能出现一些问题.所以,在这里按个人的理解谈谈它们之间的区别. 一.赋值(assignment) 在<Py ...