参考的这个

思路:

枚举冰球下一个可能所在的所有位置然后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. asp.net ajax学习系列功能强大的UpdatePanel控件
  2. linux grep 正则表达式
  3. 更新view是可以update到表的
  4. vue+springboot-前台怎么回显本地文件夹下的图片
  5. Windows查看网络端口被占用情况netstat命令
  6. Vue中怎样获取json文件中的数据
  7. 智能DNS及其工作原理: CDN实现原理
  8. 文件服务器监控用户修改信息,文件服务器监控日志软件
  9. anaconda对应python版本_Python基础——如何查看python版本、如何查看多个python版本
  10. React之解决类中的this
  11. memcached 使用 java_使用Java java_memcached client的陷阱
  12. IDEA:生成javadoc/断点调试/缓存和索引的清理
  13. ssd1306 OLED 初始化流程
  14. JS Cookies
  15. 1.3 sklearn中的preprocessing.PolynomialFeatures——多项式回归
  16. 阿里八八“好记”测试报告
  17. 【入门教程】必看!TensorFlow中文教程:机器学习从零到一
  18. 批量删除新浪微博的关注
  19. 听dalao讲课 7.27
  20. Java实现MD5和国密SM3摘要算法

热门文章

  1. LCM液晶显示模组是什么,液晶显示模块有几种类型呢
  2. 多个视频文件合成画中画效果(Python版)
  3. 设计模式之模板模式和工厂模式
  4. 微信小程序父子页面间得数据传递(对象或者数组)
  5. vue将数据导出到excel
  6. 华为海思 hikey970 详细介绍
  7. k8s dns 无法解析
  8. 【算法基础12】最小生成树的两种解法(普里姆、克鲁斯卡尔)
  9. 《InnoDB存储引擎》第五章——索引与算法
  10. excel链接隐藏工作表_在Excel 2007和2010中隐藏和取消隐藏工作表和工作簿