USACO 2.2.4 两只塔沃斯母牛
来源:互联网 发布:网页版淘宝 编辑:程序博客网 时间:2024/05/29 14:15
USACO 2.2.4 两只塔沃斯母牛
by MPS
【题目描述】
描述地图 10*10 相遇的时间,如果不能相遇,输出0
【样例输入】 【样例输出】
*...*..... 49 两只牛在森林里故意走丢了。农民John开始用他的专家技术追捕这两头牛。你的任务是模拟他们的行为(牛和John)。
追击在10x10的平面网格内进行。一个格子可以是:
(1)一个障碍物,
(2)两头牛(它们总在一起), 或者
(3)农民John.
两头牛和农民John可以在同一个格子内(当他们相遇时),但是他们都不能进入有障碍的格子。
一个格子可以是:
. 空地
* 障碍物
C 两头牛
F 农民John
这里有一个地图的例子::
*...*.....
......*...
...*...*..
..........
...*.F....
*.....*...
...*......
..C......*
...*.*....
.*.*......
牛在地图里以固定的方式游荡。每分钟,它们可以向前移动或是转弯。如果前方无障碍且不会离开地图,它们会按照原来的方向前进一步。否则它们会用这一分钟顺时针转90度。
农民John, 深知牛的移动方法,他也这么移动。
每次(每分钟)农民John和两头牛的移动是同时的。如果他们在移动的时候穿过对方,但是没有在同一格相遇,我们不认为他们相遇了。当他们在某分钟末在某格子相遇,那么追捕结束。开始时,John和牛都面向北方。
描述地图 10*10 相遇的时间,如果不能相遇,输出0
【样例输入】 【样例输出】
......*...
...*...*..
..........
...*.F....
*.....*...
...*......
..C......*
...*.*....
.*.*......
【分析】
很简单的一个模拟题目,我是用栈来模拟的,我这个蒟蒻较SB,用7个量表示状态:
奶牛的x坐标,奶牛的y坐标,奶牛当前所面向的方位,农夫的x坐标,农夫的y坐标,农夫当前所面向的方位
然后只要注意一点,就是他们会花1s来转弯,而不是同一秒内既转弯又走
由于每一个状态只会有1个决策,所以最终的搜索树退化为链,O(N)的复杂度,我们又发现,如果农夫和奶牛都走完了整个地图,那么就没必要走下去,必定不能相遇,这个可以减少时间且放止栈溢出
时间还是挺快的
【代码】
#include <string>#include <cstdlib>#include <vector>#include <queue>#include <deque>using namespace std;const int n=10;const int UP=1001;//时间上限 char board[11][11];int TIME,CX,CY,FX,FY;void readfile(){ freopen("ttwo.in","r",stdin); freopen("ttwo.out","w",stdout); int i,j; for(i=1;i<=n;i++) for(j=1;j<=n;j++){ cin>>board[i][j]; if(board[i][j]=='F'){FX=i;FY=j;board[i][j]='.';} if(board[i][j]=='C'){CX=i;CY=j;board[i][j]='.';} }}//0北 1南 2西 3东 void dfs(int cx,int cy,int pc,int fx,int fy,int fc,int t){if(t>=UP)return;if(cx==fx && cy==fy){TIME=t;return;}int cow_next_x,cow_next_y,farm_next_x,farm_next_y;if(pc==0){if(cx>1 && board[cx-1][cy]=='.') cow_next_x=cx-1,cow_next_y=cy; else { cow_next_x=cx;cow_next_y=cy; pc=3; }}else if(pc==1){if(cx<n && board[cx+1][cy]=='.') cow_next_x=cx+1,cow_next_y=cy; else { cow_next_x=cx;cow_next_y=cy; pc=2; }}else if(pc==2){if(cy-1>0 && board[cx][cy-1]=='.')cow_next_x=cx,cow_next_y=cy-1; else { cow_next_x=cx;cow_next_y=cy; pc=0; }}else if(pc==3){if(cy<n && board[cx][cy+1]=='.'){cow_next_x=cx;cow_next_y=cy+1;} else { cow_next_x=cx;cow_next_y=cy; pc=1; }}if(fc==0){if(fx>1 && board[fx-1][fy]=='.') farm_next_x=fx-1,farm_next_y=fy; else { farm_next_x=fx;farm_next_y=fy; fc=3; }}else if(fc==1){if(fx<n && board[fx+1][fy]=='.') farm_next_x=fx+1,farm_next_y=fy; else { farm_next_x=fx;farm_next_y=fy; fc=2; }}else if(fc==2){if(fy-1>0 && board[fx][fy-1]=='.')farm_next_x=fx,farm_next_y=fy-1; else { farm_next_x=fx;farm_next_y=fy; fc=0; }}else if(fc==3){if(fy<n && board[fx][fy+1]=='.'){farm_next_x=fx;farm_next_y=fy+1;fc=3;} else { farm_next_x=fx;farm_next_y=fy; fc=1; }}dfs(cow_next_x,cow_next_y,pc,farm_next_x,farm_next_y,fc,t+1);}int main(){ readfile(); dfs(CX,CY,0,FX,FY,0,0); cout<<(TIME>=UP?0:TIME); return 0;}
0 0
- USACO 2.2.4 两只塔沃斯母牛
- USACO 2.2.4 Party Lamps
- [USACO 2.2.4] Party Lamps
- USACO 2.2.4 Party Lamps
- USACO 2.2.4 Party Lamps
- USACO 2.2.4 Party Lamps
- USACO 2.2.4 Party Lamps
- USACO 2.2
- USACO:2.2.4 Party Lamps 派对灯
- (step 3.1.4)hdu 2018(母牛的故事)
- 母牛问题。
- 母牛问题
- 母牛问题
- 母牛问题
- 母牛牧场
- 母牛问题
- 母牛问题
- 母牛问题
- 以结点p为根的子树中序线索化
- 人品计算器1.0版本
- 带头结点的中序线索化
- 菜鸟授徒系列之新手入门
- 遍历中序线索二叉树
- USACO 2.2.4 两只塔沃斯母牛
- liferay namespace用法
- 构造赫夫曼树
- hdoj problem 2952 Counting Sheep(深搜DFS)
- Putty and Pycharm的风格configuration
- UVALive-6665-Dragons Cruller(Dij+Hash)
- 树莓派&nodejs相关开发过程
- Ubuntu-ADT-连接Anroid真机-无法识别问题
- ubuntu修改、删除用户