Curling 2.0 - POJ 3009
参考的这个
思路:
枚举冰球下一个可能所在的所有位置然后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相关推荐
- POJ 3009 Curling 2.0(深度优先搜索+剪枝)
POJ 3009 Curling 2.0 题目大意: 在一块光滑的h*w的矩形平面上,有若干个障碍物,用1表示以及空格用0表示.现在有一个小球在平面上的数字2的地方,通过抛掷这个小球,使其达到数字3 ...
- POJ 3009 Curling 2.0-DFS
Curling 2.0 题意 就像最强大脑里的一个游戏,从当前位置移动,撞到障碍物后才会停止(所以有可能会冲出地图姐界面),障碍物被撞后会消失,求到达终点的最短路径. 但不同的是,如果路径上可以通过终 ...
- Curling 2.0{
题目 Curling 2.0 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22417 Accepted: 9100 D ...
- poj 3009 Curling 2.0 (dfs的应用)
http://poj.org/problem?id=3009 (1)这是一个用球撞石头的游戏,撞到石头,石碎球停.在规定的10次抛球机会下,若求移动到终点就赢,否则算输了(出界直接算输). (2)每一 ...
- POJ 3009 Curling 2.0 {深度优先搜索}
原题 $On Planet MM-21, after their Olympic games this year, curling is getting popular. But the rules ...
- poj 3009 Curling 2.0
题目链接:点击打开链接 Description On Planet MM-21, after their Olympic games this year, curling is getting pop ...
- POJ 3009 Curling 2.0(简单DFS)
题意: 每一次碰到障碍则在障碍的旁边停下来,并且障碍被击碎.此时可以重新值掷一次冰球.当掷球次数超过 10 次则输出 -1. 思路: 1. 超过 10 次输出 -1 这个剪枝很关键: 2. 主要是要注 ...
- POJ Curling 2.0
题目 题目真的长,还有很多细节. #include <iostream> #include <string> using namespace std;struct Coordi ...
- POJ3009 Curling 2.0
原题链接:http://poj.org/problem?id=3009 暴力DFS + 回溯.注意行和列不要搞反,并且当搜索深度大于10的时候直接返回. View Code 1 #include &l ...
最新文章
- 遥控车_vijos1458_纪中1724_水
- iOS开发之窥探UICollectionViewController(四) --一款功能强大的自定义瀑布流
- 大势至电脑文件防泄密软件_有了数据防泄密软件,还会担心企业文件泄漏吗?...
- oracle日期相减工作日_Oracle 计算两个日期间隔的天数、月数和年数
- Python 生成requirement 使用requirements.txt
- 主流java框架理解
- 【数据结构笔记22】图的遍历例题:拯救007(应用DFS)、六度空间(应用BFS)
- 表格列数太多 页面怎么设计_B端产品设计规范分享
- [CodeForces 372A] Counting Kangaroos is Fun
- 用php实现拍照,php中实现视频拍照
- 使用adb命令启动模拟器
- 局域网SDN技术硬核内幕 一 从二层到大二层
- 【微信小程序项目】——十分钟开发网络API·天气查询小程序、天气查询,美观简约,简单易上手
- 天啦,这才是英国退欧的真相!
- 隐含马尔可夫 隐含状态_隐含可读性
- [haut] 1281: 邪能炸弹 dp
- 利用leaflet做一个飞机航线 可根据方向动态掉头
- android wifi热点设置用户数,android 如何获取连接wifi热点的设备数量
- 单位换算:潜热通量(w/m2)转换为蒸散发(mm/s)
- 汽车充电桩的功能有哪些