poj_3009_Curling 2.0(搜索)
来源:互联网 发布:百度卫士软件怎么样 编辑:程序博客网 时间:2024/05/29 03:01
题型:搜索
题意:
外星球上的冰壶运动(太扯了)。。。
冰壶在一个图中滑动,从s点出发,每次推出去都会一直滑下去除非被砖块(block)挡住,停下来之后再继续推。
规则如下:
1、只能在行和列的方向上移动,不能在对角线方向上移动,除了旁边有砖块之外的方向都能移动;
2、冰壶击中砖块的时候:
(1)冰壶停在砖块之前的那一个地方;
(2)被碰撞过的砖块消失;
3、若是冰壶划出了图之外,则游戏失败;
4、若冰壶到达goal(即G点),冰壶停下来,游戏胜利;
5、若步数不在10次以内,则游戏失败。
求所需的最小步数。
0代表空地;
1代表砖块;
2代表起点;
3代表终点。
如下图:
样例所需最小步数几位5.
分析:
此题可以用DFS解决。
问题来了,我们到底怎么来找这些路线呢?
首先我们可以用把S的位置记录下来
然后我们构造一个dfs函数,参数有x , y , step,即当前的点的坐标和步数。
如何来保证能走的方向都走过呢?我们可以用一个二维数组存一下四个方向,然后穷举这些方向就可以了。
接下来就可以通过递归来找出答案了。
代码:
#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int inf=999999;int w,h,ans;int map[200][200];int start[2];int dir[4][2]= {{0,-1},{1,0},{0,1},{-1,0}};void dfs(int x,int y,int step){ int xx,yy; if(step>10) return; for(int i=0; i<4; i++) { if(map[x+dir[i][0]][y+dir[i][1]]!=1) { xx=x; yy=y; while(map[xx+dir[i][0]][yy+dir[i][1]]!=1) { xx=xx+dir[i][0]; yy=yy+dir[i][1]; if(xx<0 || xx>=h || yy<0 || yy>=w) { break; } if(map[xx][yy]==3) { if(ans>step) { ans=step; } return; } } if(xx>=0 && xx<h && yy>=0 && yy<w) { map[xx+dir[i][0]][yy+dir[i][1]]=0; dfs(xx,yy,step+1); map[xx+dir[i][0]][yy+dir[i][1]]=1; } } }}int main(){ while(scanf("%d%d",&w,&h)&&w&&h) { memset(map,0,sizeof(map)); for(int i=0; i<h; i++) { for(int j=0; j<w; j++) { scanf("%d",&map[i][j]); if(map[i][j]==2) { start[0]=i; start[1]=j; } } } ans=inf; dfs(start[0],start[1],1); if(ans==inf) { printf("-1\n"); } else { printf("%d\n",ans); } //cout<<endl; } return 0;}
- poj_3009_Curling 2.0(搜索)
- POJ_3009_Curling 2.0
- poj3009--Curling 2.0(搜索练习1)
- 搜索之广度搜索【迷宫搜索】(输出一条路径)
- 百度地图(二)全城搜索,详情搜索,附近搜索
- 数组搜索(search)之线性搜索与二分法搜索
- SharePoint2010 搜索(2) 简单的搜索
- 二分搜索(折半搜索)的实现
- 记忆化搜索(搜索+dp思想)
- Android搜索建议(搜索联想)
- 搜索算法-二分搜索(折半查找)
- 搜索(广度优先搜索) BFS 1
- 搜索(广度优先搜索)BFS 2
- Beam Search(集束搜索/束搜索)
- 图的搜索(深度搜索)
- poj1011(搜索应用)
- 搜索(3)
- bsearch(二元搜索)
- olap和oltp系统区别
- Cable Modem Initialization and Reinitialization
- 2013年5月23日(7-9ddraw裁剪器)
- Tiny210V2(S5PV210)的U-boot分析
- 黑马程序员_String类和StringBuffer
- poj_3009_Curling 2.0(搜索)
- ios开发中归档的使用
- 记一次笔试
- 写一个能直接执行的.sql文件,如何在这里连接数据库?
- 黑马程序员-交通灯管理系统
- C# sealed 方法
- 杭电ACM1003 MAX_SUM
- 第三章 硬件基础知识学习
- VC++/MFC更新状态栏窗格的文本,设置状态栏的文本