原题链接:http://poj.org/problem?id=3009

  暴力DFS + 回溯。注意行和列不要搞反,并且当搜索深度大于10的时候直接返回。

View Code

  1 #include <stdio.h>
  2 #include <string.h>
  3
  4 int r, c, ans;
  5 int g[25][25];
  6
  7 inline int min(int x, int y){return x < y ? x : y;}
  8
  9 int checkup(int x, int y)
 10 {
 11     if(y - 1 > 0 && g[y - 1][x] == 1)
 12         return 0;
 13     int i;
 14     for(i = y - 1; i > 0; i --)
 15     {
 16         if(g[i][x] == 3)
 17             return -1;
 18         if(g[i][x] == 1)
 19         {
 20             g[i][x] = 0;
 21             return i + 1;
 22         }
 23     }
 24     return 0;
 25 }
 26
 27 int checkdown(int x, int y)
 28 {
 29     if(y + 1 <= r && g[y + 1][x] == 1)
 30         return 0;
 31     int i;
 32     for(i = y + 1; i <= r; i ++)
 33     {
 34         if(g[i][x] == 3)
 35             return -1;
 36         if(g[i][x] == 1)
 37         {
 38             g[i][x] = 0;
 39             return i - 1;
 40         }
 41     }
 42     return 0;
 43 }
 44
 45 int checkleft(int x, int y)
 46 {
 47     if(x - 1 > 0 && g[y][x - 1] == 1)
 48         return 0;
 49     int i;
 50     for(i = x - 1; i > 0; i --)
 51     {
 52         if(g[y][i] == 3)
 53             return -1;
 54         if(g[y][i] == 1)
 55         {
 56             g[y][i] = 0;
 57             return i + 1;
 58         }
 59     }
 60     return 0;
 61 }
 62
 63 int checkright(int x, int y)
 64 {
 65     if(x + 1 <= c && g[y][x + 1] == 1)
 66         return 0;
 67     int i;
 68     for(i = x + 1; i <= c; i ++)
 69     {
 70         if(g[y][i] == 3)
 71             return -1;
 72         if(g[y][i] == 1)
 73         {
 74             g[y][i] = 0;
 75             return i - 1;
 76         }
 77     }
 78     return 0;
 79 }
 80
 81 void dfs(int cx, int cy, int d)
 82 {
 83     if(d >= 10)
 84         return ;
 85     int up = checkup(cx, cy);
 86     if(up == -1)
 87     {
 88         ans = (ans == -1 ? d + 1 : min(ans, d + 1));
 89         return ;
 90     }
 91     else if(up != 0)
 92     {
 93         dfs(cx, up, d + 1);
 94         g[up - 1][cx] = 1;
 95     }
 96
 97     int down = checkdown(cx, cy);
 98     if(down == -1)
 99     {
100         ans = (ans == -1 ? d + 1 : min(ans, d + 1));
101         return ;
102     }
103     else if(down != 0)
104     {
105         dfs(cx, down, d + 1);
106         g[down + 1][cx] = 1;
107     }
108
109     int left = checkleft(cx, cy);
110     if(left == -1)
111     {
112         ans = (ans == -1 ? d + 1 : min(ans, d + 1));
113         return ;
114     }
115     else if(left != 0)
116     {
117         dfs(left, cy, d + 1);
118         g[cy][left - 1] = 1;
119     }
120
121     int right = checkright(cx, cy);
122     if(right == -1)
123     {
124         ans = (ans == -1 ? d + 1 : min(ans, d + 1));
125         return ;
126     }
127     else if(right != 0)
128     {
129         dfs(right, cy, d + 1);
130         g[cy][right + 1] = 1;
131     }
132 }
133
134 int main()
135 {
136     int i, j, sx, sy;
137     while(scanf("%d%d", &c, &r), r + c)
138     {
139         for(i = 1; i <= r; i ++)
140         {
141             for(j = 1; j <= c; j ++)
142             {
143                 scanf("%d", &g[i][j]);
144                 if(g[i][j] == 2)
145                     sx = j, sy = i;
146             }
147         }
148         ans = -1;
149         dfs(sx, sy, 0);
150         printf("%d\n", ans);
151     }
152     return 0;
153 }

  

转载于:https://www.cnblogs.com/huangfeihome/archive/2012/10/16/2726776.html

POJ3009 Curling 2.0相关推荐

  1. poj3009 Curling 2.0 深搜

    PS:以前看到题目这么长就没写下去了.今天做了半天,没做出来.准备看题解,打开了网站都忍住了,最后还是靠自己做出来的.算是一点进步吧. 分析: 题目的意思没明白或者理解有偏差都没办法做题.看样例3和样 ...

  2. 【暑假复习】【搜索】POJ3009:Curling 2.0

    题意 给出一个图,有石头和空地,有一个球,可以向上下左右任意一个没有相邻石头的方向持续移动,直到撞到石头为止(球停留在石头的前一格),并且会使撞到的石头消失,求让球到达目的地最少的步数(不一定非要在终 ...

  3. POJ 3009 Curling 2.0(深度优先搜索+剪枝)

    POJ 3009  Curling 2.0 题目大意: 在一块光滑的h*w的矩形平面上,有若干个障碍物,用1表示以及空格用0表示.现在有一个小球在平面上的数字2的地方,通过抛掷这个小球,使其达到数字3 ...

  4. Curling 2.0{

    题目 Curling 2.0 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22417   Accepted: 9100 D ...

  5. poj 3009 Curling 2.0

    题目链接:点击打开链接 Description On Planet MM-21, after their Olympic games this year, curling is getting pop ...

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

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

  7. POJ 3009 Curling 2.0(简单DFS)

    题意: 每一次碰到障碍则在障碍的旁边停下来,并且障碍被击碎.此时可以重新值掷一次冰球.当掷球次数超过 10 次则输出 -1. 思路: 1. 超过 10 次输出 -1 这个剪枝很关键: 2. 主要是要注 ...

  8. poj 3009 Curling 2.0 (dfs的应用)

    http://poj.org/problem?id=3009 (1)这是一个用球撞石头的游戏,撞到石头,石碎球停.在规定的10次抛球机会下,若求移动到终点就赢,否则算输了(出界直接算输). (2)每一 ...

  9. POJ Curling 2.0

    题目 题目真的长,还有很多细节. #include <iostream> #include <string> using namespace std;struct Coordi ...

最新文章

  1. java怎么修改fxml,JavaFX FXML修改列表
  2. jquery地址栏链接与a标签链接匹配添加样式!
  3. 云炬Android开发笔记 12基于WebView的混合App框架设计(包含浏览器与原生请求Cookie的处理)
  4. 【机器学习基础】前置知识(一):数学符号及希腊字母
  5. 我们在tool里给ui element设置断点,然后操作的时候,断点就触发了。Framework是咋实现的
  6. 如何维持手机电池寿命_延长手机电池寿命终极技巧教学,iPhone和安卓手机皆适合...
  7. php root权限执行命令,如何使用PHP执行需要root权限的系统命令
  8. 进程和线程的区别, 面相对象补充, 进程, 数据共享, 锁, 进程池, 爬虫模块(requests, bs4(beautifulsoup))...
  9. 数据挖掘:数据清洗——异常值处理
  10. 第一章 .NET基础-C#基础
  11. windows与linux多线程对比
  12. 阿里面试官:分别说说微信和淘宝扫码登录背后的实现原理?
  13. oracle dbf文件迁移,Oracle安装盘空间不足,对.DBF文件进行迁移
  14. QQ个性装扮气泡免费使用
  15. vue手动封装分页组件
  16. PS2018学习笔记(19-24节)
  17. SpringBoot+Mybatis+Mysql+Vue+ElementUi实现一个《流浪猫狗领养救助管理系统》毕业设计(超详细教程)
  18. StarlingX分布式云部署(抢鲜)
  19. 小程序 多张图片上传(源码分享+实现分析)
  20. 西安航天民芯电子 推出原厂原装MT36291 SOT23-6 PIN对PIN兼替FP6291LR-G1 MT3608

热门文章

  1. 【cJson】JSON的基本概念
  2. php 安装 phpunit,phpunit的安装
  3. linux课程_linux系统使用课程更新提示
  4. DM8 jdbc调用存储过程传参list<实体类>
  5. 让VC程序在Win7下获得管理员权限
  6. Pixhawk之姿态解算篇(2)_mahony算法分析
  7. php 正则获取某个div,php正则匹配html中带class的div并选取其中内容的方法
  8. pytorch 之 冻结某层参数,即训练时不更新
  9. c++ 模板教程(c语言中文网) 自己运行实例
  10. linux diff命令_Linux diff命令示例