USACO The Tamworth Two

来源:互联网 发布:互穿网络防腐涂料 编辑:程序博客网 时间:2024/04/29 19:07

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

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

/*ID: jinusac1PROG: ttwoLANG: 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;}


 

0 0
原创粉丝点击