POJ-3009 Curling 2.0
2015-08-06 15:14
260 查看
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> using namespace std; const int maxn = 25; int maze[maxn][maxn]; int stp[4][2]={{0,-1},{0,1},{-1,0},{1,0}}; int w, h, ans, flag; struct Maze { int x; int y; }; Maze start; bool judge(int x, int y) { if(x >= 0 && y >= 0 && x < w && y < h) return true; else return false; } void dfs(Maze temp, int step) { if(step > 10) return ; for(int i = 0; i < 4; i ++) { int nx = temp.x + stp[i][0]; int ny = temp.y + stp[i][1]; int t = 0; while(judge(nx, ny) && maze[nx][ny] == 0) { nx += stp[i][0]; ny += stp[i][1]; t ++; } if(judge(nx, ny) && maze[nx][ny] == 3) { if(step + 1 > 10) return ; if(ans == -1) ans = step + 1; else ans = min(ans, step + 1); return ; } if(t > 0) { if(judge(nx, ny)) { Maze next; next.x = nx - stp[i][0]; next.y = ny - stp[i][1]; maze[nx][ny] = 0; dfs(next, step + 1); maze[nx][ny] = 1; } } } } int main() { while(~scanf("%d %d", & w, & h)) { if(!w && !h) break; memset(maze, 0, sizeof(maze)); for(int i = 0; i < h; i ++) { for(int j = 0; j < w; j ++) { scanf("%d", & maze[j][i]); if(maze[j][i] == 2) { start.x = j; start.y = i; maze[j][i] = 0; } } } ans = -1; dfs(start, 0); cout << ans << endl; } }
题意:算是一种冰壶游戏吧。也是一个格子棋盘。确定初始位置和终点位置。棋子选择一个方向一直前进。直到碰到墙 又可以重新选择上下左右四个方向中的一个。如果出界不计 此方法失败。直到棋子到达终点。如果步数超过10步 失败。失败结果输出-1。输出成功步数最小值。
题解:dfs吧。刚开始 参考别人的思路。就是一直递归找。应该也挺好看懂的。为了方便 判断是否在界内写成了函数。还有注意找到初始位置后 将初始位置的2变为0!(一开始没考虑到。如果不变0..2就变成挡路的了..)还有就是step+1得放在下一个dfs中加。每一步都不能落下判断是否越界..否则程序崩溃..
相关文章推荐
- Java中实现用户点击关闭窗口按钮后提示用户,选择“是”后退到父窗口,选择“否”留在原窗口
- 蜂鸣器驱动电路
- HTML中的ID的命名
- 数据结构基础(6) --顺序栈的设计与实现
- 附录A:db_install.rsp详解
- Hdu 2066 一个人的旅行
- H5 localStorage
- servlet与json
- opencv提取截获图像
- MySQL 事件调度器创建
- The method setProgress(int, int, boolean) is undefined for the type NotificationCompat.Builder
- 两种编程风格
- ListView实现下拉刷新和上拉加载
- mongodb的crud
- pfx 证书怎么打开
- Leetcode43 Multiply Strings
- 从数据沉淀、数据挖掘和数据呈现这三个概念了解大数据
- jQuery的选择器中的通配符[id^='code']
- jquery判断值是否存在于数组中
- Android基础入门教程——4.1.1 Activity初学乍练