2012年9月2日
摘要: 大意:奥林匹克冰球运动的一种变体,给定你一个特定的迷宫,出口以及入口,从出口到入口最小走几步。思路:(1)不可用BFS,冰球每次撞击障碍物时,障碍物会消失。而BFS会导致整个迷宫状态的改变,所以只能用DFS。(2)当冰球是运动时,撞击障碍物,然后停下,需要回溯。静止时,不可能向有障碍物的方向走。(3)冰球不向普通的走法一样是一步一步走,而是一条直线的走。它可能在运动的过程中会超出边界,这就需要判断,只有继续递归调用时,步数才会加1。CODE:#include<stdio.h>#include<stdlib.h>#include<string.h>usingn 阅读全文
posted @ 2012-09-02 20:41 有间博客 阅读(212) 评论(0) 推荐(0) 编辑
摘要: 大意:给定一个迷宫以及入口与出口,限制条件为最多的拐弯数为k,问是否在拐弯数limit之内要能够从迷宫出去。思路:用BFS求得每个顶点的最小拐弯数,然后判断出口拐弯数是否小于或等于k就行了,如果不能,则所有的都不能。那如何求得呢?(1)即一条路走到底,如果出队拓展路径或者一直往前延展且没有被标记那么则step++;(2)遇到已经走过的(已标记),说明这个节点的最小拐弯数不是它,经过它,但拐弯数不增加,继续往前走。(3)比较最先一个到达出口的拐弯数判断与limit的相对大小。关于特殊情况的讨论:数字代表可能的步数,x代表标记,s代表新的节点。1xx 3sxx 0像这种情况,0的可能拐弯数最小可能 阅读全文
posted @ 2012-09-02 16:29 有间博客 阅读(1757) 评论(0) 推荐(0) 编辑
摘要: BFS.CODE:#include<stdio.h>#include<stdlib.h>#include<string.h>#include<queue>usingnamespacestd;constintSIZE=100010;#definelow_bound0#definehigh_bound100010intv[SIZE];intn,k;structnode{intx,step;};intcheck(intx){if(x>=low_bound&&x<=high_bound)return1;return0;}int 阅读全文
posted @ 2012-09-02 12:04 有间博客 阅读(155) 评论(0) 推荐(0) 编辑
摘要: 大意:给定一个3D迷宫,已知出口和入口,求最小逃脱迷宫的时间。思路1:DFS需要求最小路需要回溯,果断TLE。下附DFS代码:voiddfs(intx,inty,intz){if(!check(x,y,z)||flag[x][y][z]||maze[x][y][z]=='#')return;elseif(x==ex&&y==ey&&z==ez){MIN<?=step;return;}for(inti=0;i<6;i++){intxx=x+dx[i];intyy=y+dy[i];intzz=z+dz[i];flag[xx][yy][zz 阅读全文
posted @ 2012-09-02 11:05 有间博客 阅读(169) 评论(0) 推荐(0) 编辑