您的位置:首页 > 其它

USACO The Tamworth Two

2014-09-01 12:25 302 查看
  一个很直观的想法,分别模拟羊和FJ的路径,记录时间三维数组,i,j,k表示走到第i行第j列方向为k的时间,之后只要分别判断每个格子的时间是否可以相等就OK了,

关键是怎么停下来,先想到的是一共有400种走法,即i(10)*j(10)*k(4),但是在想一下就发现只要把初始时间设为1,判断下一个是否为0即可,然后需分4种情况讨论两个时间是否可以相等,注意不要判断无法到达的点。

/*
ID: jinusac1
PROG: ttwo
LANG: C++
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int rf[12][12][4]={0},rc[12][12][4],d[4][2]={-1,0,0,1,1,0,0,-1};
char h[12][12];
bool mark[410];
int main()
{
freopen("ttwo.in","r",stdin);
freopen("ttwo.out","w",stdout);
int fi,fj,ci,cj;
memset(h,'*',sizeof(h));
for(int i=1;i<=10;i++){
int j=1;
char t;
while((t=getchar())!='\n'){
h[i][j]=t;
if(t=='F') {fi=i;fj=j;h[i][j]='.';}
if(t=='C') {ci=i;cj=j;h[i][j]='.';}
j++;
}
}
int t=1,dir=0,Tf=0,Tc=0,sf=0,sc=0;
while(true){
rf[fi][fj][dir]=t;
if(h[fi+d[dir][0]][fj+d[dir][1]]=='*') dir=(dir+1)%4;
else {fi+=d[dir][0];fj+=d[dir][1];}
if(rf[fi][fj][dir]){
sf=rf[fi][fj][dir];
Tf=t-rf[fi][fj][dir]+1;
break;
}
t++;
}
t=1;dir=0;
while(true){
rc[ci][cj][dir]=t;
if(h[ci+d[dir][0]][cj+d[dir][1]]=='*') dir=(dir+1)%4;
else {ci+=d[dir][0];cj+=d[dir][1];}
if(rc[ci][cj][dir]){
sc=rc[ci][cj][dir];
Tc=t-rc[ci][cj][dir]+1;
break;
}
t++;
}
int rmin=100000;
for(int i=1;i<=10;i++)
for(int j=1;j<=10;j++){
if(h[i][j]=='*') continue;
for(int k2=0;k2<4;k2++)
for(int k1=0;k1<4;k1++){
int a=rf[i][j][k1],b=rc[i][j][k2];
if(a==0||b==0) continue;
if(a<sf&&b<sc){
if(a==b) rmin=rmin>a?a:rmin;
else continue;
}
else if(a>=sf&&b<sc){
while(a<=b){
if(a==b) rmin=rmin>a?a:rmin;
a+=Tf;
}
continue;
}
else if(a<sf&&b>=sc){
while(a>=b){
if(a==b) rmin=rmin>a?a:rmin;
b+=Tc;
}
}
else{
memset(mark,false,sizeof(mark));
while(a<=400) {mark[a]=true;a+=Tf;}
while(b<=400){
if(mark[b]){
rmin=rmin>b?b:rmin;
break;
}
b+=Tc;
}
}
if(rmin==49) cout<<i<<" "<<j<<endl;
}
}
if(rmin==100000) cout<<0<<endl;
else cout<<rmin-1<<endl;
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  USACO