POJ 3009 Curling 2.0 回溯,dfs 难度:0
2015-06-05 21:55
302 查看
http://poj.org/problem?id=3009
如果目前起点紧挨着终点,可以直接向终点滚(终点不算障碍)
View Code
如果目前起点紧挨着终点,可以直接向终点滚(终点不算障碍)
#include <cstdio> #include <cstring> using namespace std; const int maxn = 21; int maz[maxn][maxn]; int n,m; const int dx[4] = {1,-1,0,0}; const int dy[4] = {0,0,1,-1}; bool in(int x,int y) { return x >= 0 && x < n && y >= 0 && y < m; } bool dfs(int x,int y,int step) { if(step == 0)return maz[x][y] == 3; for(int i = 0; i < 4; i++) { int tx = x + dx[i],ty = y + dy[i]; if(maz[tx][ty] == 1)continue; while(in(tx,ty) && maz[tx][ty] == 0) { tx += dx[i]; ty += dy[i]; } if(!in(tx,ty))continue; if(maz[tx][ty] == 3)return true; maz[tx][ty] = 0; if(dfs(tx - dx[i],ty - dy[i],step - 1)) { return true; } maz[tx][ty] = 1; } return false; } int main() { while(scanf("%d%d",&m,&n) == 2 && (m || n)) { for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { scanf("%d",maz[i] + j); } } for(int x = 0; x < n; x++) { for(int y = 0; y < m; y++) { if(maz[x][y] == 2) { maz[x][y] = 0; bool fl = false; for(int i = 0; i < 11; i++) { if(dfs(x, y ,i)) { fl = true; printf("%d\n",i); break; } } if(!fl) { puts("-1"); } break; } } } } return 0; }
View Code
相关文章推荐
- 小管理 大智慧
- 我爱淘冲刺阶段站立会议2每天任务6
- Windows server 服务器之DHCP服务器升级
- Metrics类
- Android App每日更换壁纸
- netty源码编译环境搭建
- csdn code使用笔记
- display:inline、block、inline-block的区别 摘】
- CSS3 transform
- Eclipse中查看android-support-v4 API
- JavaScript基础
- 《Entity Framework 6 Recipes》中文翻译系列 (45) ------ 第八章 POCO之获取原始对象与手工同步对象图和变化跟踪器
- JSP请求页面(传参)
- 监听ListView是否滚动到顶部
- TCP的.cc文件代码解释(中文)
- leetcode ----Trie/stack专题
- 当前不会命中断点,此位置当前尚未加载可执行代码
- TCP的.cc文件代码解释(中文)
- Git Push 避免用户名和密码方法
- Java异常的处理