poj3009-dfs深搜
2015-07-19 12:55
211 查看
有图片插入很麻烦,附上链接。
poj3009
有点像打砖块的游戏,不过游戏的目标是让球从起点到达终点,而且只能是直线,每次遇到砖块就停下,被打中的砖块消失,停下以后可以继续朝四个方向投掷,投掷次数不超过十次。(不限制次数的话程序运行时间难以估量)
用简单的深搜就可以了,虽然我觉得也不怎么简单。
poj3009
有点像打砖块的游戏,不过游戏的目标是让球从起点到达终点,而且只能是直线,每次遇到砖块就停下,被打中的砖块消失,停下以后可以继续朝四个方向投掷,投掷次数不超过十次。(不限制次数的话程序运行时间难以估量)
用简单的深搜就可以了,虽然我觉得也不怎么简单。
#include<iostream> #include<cstring> #include<cstdio> using namespace std; const int sz = 21; int n, m, k; int ans = 11; //初始值取11,比较过程中的更新才不会出现问题 int flag = 0; //是否有解 struct point { int x, y; }; point start, end; int dir[4][2] = {{1,0}, {0,1},{-1,0},{0,-1}}; int Map[sz+2][sz+2]; void creatMap() //用-1包围边界,易于判断是否出界 { for(int i = 0; i < n + 2; i ++) for(int j = 0; j < m + 2; j ++) { if(i == 0 || i == n + 1 || j == 0 || j == m + 1) Map[i][j] = -1; } } void dfs(int x, int y, int step) { int j = 0; if(step >= 10) return ; for(int i = 0; i < 4; i ++) { if(Map[x + dir[i][0]][y + dir[i][1]] == 1 || Map[x + dir[i][0]][y + dir[i][1]] == -1) //出界或第一步就是墙 continue; int dx = x + dir[i][0]; //成功迈出第一步 int dy = y + dir[i][1]; while(Map[dx][dy] != 1 && Map[dx][dy] != -1 && Map[dx][dy] != 3) //可以继续走的情况 { dx = dx + dir[i][0]; dy = dy + dir[i][1]; j ++; //走的步数 没有走就不用继续进行了 } if(Map[dx][dy] == 3) //到达 更新最小步数 { ans = ans > step + 1 ? step + 1 : ans; if(ans <= 10) flag = 1; return; } if(j > 0) //没有到达,但又走了一个方向,继续搜索 { if(Map[dx][dy] == 1) { Map[dx][dy] = 0; //砖块消失 dfs(dx-dir[i][0],dy-dir[i][1],step+1); Map[dx][dy] = 1; //还原砖块 } } } } int main() { while(scanf("%d %d", &m, &n)) { if(n == 0 && m == 0) return 0; flag = 0; //reset ans = 11; //reset memset(Map,0,sizeof(Map)); for(int i = 1; i < n + 1; i ++) for(int j = 1; j < m + 1; j ++) { scanf("%d", &Map[i][j]); if(Map[i][j] == 2) { start.x = i ; start.y = j ; } } creatMap(); dfs(start.x,start.y,0); if(flag) cout << ans << endl; else cout << "-1" << endl; } }
相关文章推荐
- JAVA基础_Java的23种设计模式之单例模式
- 浮点数在计算机中存储方式
- 不需要打密码的sudo方法
- [amanhardikar] - VoIP
- bool([x]) 将x转换为Boolean类型
- 主成分分析(PCA)原理详解
- 指针和指针的指针
- Digester 详解
- [amanhardikar] - PKI
- 减少iPhone手机系统版本号
- bin(x) 将整数x转换为二进制字符串
- HTTP 笔记与总结(7)HTTP 缓存(配合 Apache 服务器)
- chr(i) 返回整数i对应的ASCII字符
- [amanhardikar] - Cryptography v1.1
- HTTP Content-type
- poj 2186 Popular Cows 【有向图求SCC +缩点】【求图中有多少个点 可以由其余所有点通过存在路径到达】
- WPF与JS 函数、回调函数调用
- javaAPI(字符流,转换流)
- hex(x) 将整数x转换为16进制字符串
- [Java学习]使用digester 解析xml配置文件