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;
}