参考的这个

思路:

枚举冰球下一个可能所在的所有位置然后DFS。
改了一天的BUG,结果发现这个的长宽是反过来输入的,裂开。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 50;
int g[N][N];
int n, m;
int ex, ey;int xx[4] = {1, 0, -1, 0};
int yy[4] = {0, 1, 0, -1};int ans = 11;void dfs(int x, int y, int temp)
{if (x == ex && y == ey) {//                ans = min(ans, temp);if (temp < ans) ans = temp;return;}if (temp == 10 || temp >= ans) return;for (int i = 0; i < 4; i ++ ){int dx = x + xx[i];int dy = y + yy[i];while (dx >= 1 && dx <= n && dy >= 1 && dy <= m && g[dx][dy] != 1){//                        if (dx < 1 || dx > n || dy < 1 || dy > m || g[dx][dy] == 1) break;if (dx == ex && dy == ey){temp ++;if (temp < ans) ans = temp;
//                                ans = min(ans, temp + 1);return;}dx += xx[i];dy += yy[i];}if (dx < 1 || dx > n || dy < 1 || dy > m || (x + xx[i] == dx && y + yy[i] == dy)) continue;g[dx][dy] = 0;temp ++;dfs(dx - xx[i], dy - yy[i], temp);temp --;g[dx][dy] = 1;}
}int main()
{while (cin >> m >> n, n + m){//                if (n == 0 && m == 0) break;memset(g, 0, sizeof g);ans = 11;int sx, sy;for (int i = 1; i <= n; i ++ ){for (int j = 1; j <= m; j ++ ){cin >> g[i][j];if (g[i][j] == 2) {sx = i;sy = j;g[sx][sy] = 0;}if (g[i][j] == 3){ex = i;ey = j;}}}dfs(sx, sy, 0);if (ans == 11 ){cout << -1 << endl;}else cout << ans << endl;}return 0;
}
//using namespace std;
//const int N = 25;
//int g[N][N];
//int n, m;
//
//int xx[4] = {1, 0, -1, 0};
//int yy[4] = {0, 1, 0, -1};
//
//int cnt = 0;
//int ans = 0x3f3f3f3f;
//
//
//void dfs(int x, int y, int u, int d, int l, int r)
//{//        cout << x << " " << y << endl;
//        if (u > 10 || d > 10 || l > 10 || r > 10) return;
//        for (int i = 0; i < 4; i ++ )
//        {//                bool flag = 0;
//                int dx = dx, dy = dy;
//                if (g[dx + xx[i]][dy + yy[i]] == 1) continue; //不可以相邻
//
//                while (1)
//                {//                        if (dx >= 1 && dx <= n && dy >= 1 && dy <= m) //不越界的情况
//                        {//                                //到达障碍
//                                if (g[dx][dy] == 1)
//                                {//                                        cnt ++;
//                                        g[dx][dy] = 0;
//                                        if (i == 0)
//                                        {//                                                dfs(dx - 1, dy, u, d, l, r + 1);
//                                        }
//                                        else if (i == 1)
//                                        {//                                                dfs(dx, dy - 1, u, d + 1, l, r);
//                                        }
//                                        else if (i == 2)
//                                        {//                                                dfs(dx + 1, dy, u, d, l + 1, r);
//                                        }
//                                        else if (i == 3)
//                                        {//                                                dfs(dx, dy + 1, u + 1, d, l, r);
//                                        }
//                                        cnt --;
//                                        g[dx][dy] = 1;
//                                        break;
//                                }
//
//                                //到达终点
//                                if (g[dx][dy] == 3)
//                                {//                                        cnt ++;
//                                        ans = min(cnt, ans);
//                                        cnt --;
//                                        break;
//                                }
//                        }
//                        //超出界限
//                        if (dx > n || dx < 1 || dy > n || dy < 1) break;
//                        dx += xx[i];
//                        dy += yy[i];
//                }
//        }
//}
//
//
//int main()
//{//        while (cin >> n >> m)
//        {//
//                if (n ==0 && m == 0) break;
//
//                int a, b;
//                ans = 0x3f3f3f3f;
//                for (int i = 1; i <= n; i ++ )
//                {//                        for (int j = 1; j <= m; j ++ )
//                        {//                                cin >> g[i][j];
//
//                                if (g[i][j] == 2)
//                                {//                                        g[i][j] = 0;
//                                        a = i;
//                                        b = j;
//                                }
//                        }
//                }
//
//                dfs(a, b, 0, 0, 0, 0);
//                if (ans == 0x3f3f3f3f) cout << -1 << endl;
//                else cout << ans << endl;
//        }
//
//        return 0;
//}//                while (1)
//                {//                        if (g[dx + xx[i]][dy + yy[i]] == 1)
//                        {//                                if (!f)
//                                {//                                        break;
//                                }
//                                f = 1;
//                                break;
//                        }
//                        if (g[dx + xx[i]][dy + yy[i]] == 3)
//                        {//                                ans = min (ans, temp + 1);
//                                return;
//                        }
//                        if (dx > n || dx < 1 || dy < 1 || dx > m)
//                        {//                                f = 0;
//                                break;
//                        }
//                        dx += xx[i];
//                        dy += yy[i];
//                        f = 1;
//                }
//                if (f)
//                {//                        g[dx + xx[i]][dy + yy[i]] = 0;
//                        dfs(dx, dy, temp + 1);
//                        g[dx + xx[i]][dy + yy[i]] = 1;
//                }
//                else continue;

Curling 2.0 - POJ 3009相关推荐

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

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

  2. POJ 3009 Curling 2.0-DFS

    Curling 2.0 题意 就像最强大脑里的一个游戏,从当前位置移动,撞到障碍物后才会停止(所以有可能会冲出地图姐界面),障碍物被撞后会消失,求到达终点的最短路径. 但不同的是,如果路径上可以通过终 ...

  3. Curling 2.0{

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

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

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

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

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

  6. poj 3009 Curling 2.0

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

  7. POJ 3009 Curling 2.0(简单DFS)

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

  8. POJ Curling 2.0

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

  9. POJ3009 Curling 2.0

    原题链接:http://poj.org/problem?id=3009 暴力DFS + 回溯.注意行和列不要搞反,并且当搜索深度大于10的时候直接返回. View Code 1 #include &l ...

最新文章

  1. 遥控车_vijos1458_纪中1724_水
  2. iOS开发之窥探UICollectionViewController(四) --一款功能强大的自定义瀑布流
  3. 大势至电脑文件防泄密软件_有了数据防泄密软件,还会担心企业文件泄漏吗?...
  4. oracle日期相减工作日_Oracle 计算两个日期间隔的天数、月数和年数
  5. Python 生成requirement 使用requirements.txt
  6. 主流java框架理解
  7. 【数据结构笔记22】图的遍历例题:拯救007(应用DFS)、六度空间(应用BFS)
  8. 表格列数太多 页面怎么设计_B端产品设计规范分享
  9. [CodeForces 372A] Counting Kangaroos is Fun
  10. 用php实现拍照,php中实现视频拍照
  11. 使用adb命令启动模拟器
  12. 局域网SDN技术硬核内幕 一 从二层到大二层
  13. 【微信小程序项目】——十分钟开发网络API·天气查询小程序、天气查询,美观简约,简单易上手
  14. 天啦,这才是英国退欧的真相!
  15. 隐含马尔可夫 隐含状态_隐含可读性
  16. [haut] 1281: 邪能炸弹 dp
  17. 利用leaflet做一个飞机航线 可根据方向动态掉头
  18. android wifi热点设置用户数,android 如何获取连接wifi热点的设备数量
  19. 单位换算:潜热通量(w/m2)转换为蒸散发(mm/s)
  20. 汽车充电桩的功能有哪些

热门文章

  1. 电脑知识:台式电脑应该选择品牌和组装,值得收藏
  2. 区块链:“我还活在1994!”
  3. 画中画 视频叠加 视频覆盖 overlay
  4. 【Windows】Windows10家庭版永久关闭自动更新
  5. 最小生成树算法超详细教程
  6. pytorch中tf.nn.functional.softmax(x,dim = -1)对参数dim的理解
  7. 建立数据思维的13个实用思维工具
  8. Java的Scanner对象
  9. 【项目】前端实习——知识库项目总结
  10. 算法分析与设计(一)——0-1背包问题