[USACO2.4]两只塔姆沃斯牛 The Tamworth Two题解
[USACO2.4]两只塔姆沃斯牛 The Tamworth Two题解
这道题其实难度并不大,只用注意方向就可以了。
写完之后去看了一下题解,发现了一些异同:
1.一些变量
和许多大佬一样,我在方向上用了1,2,3,4,分别表示北,东,南,西。以及用变量记录FarmerJohn和Cows的位置,用maps数组来记录地图。
2.关于边界
很多大佬都在移动过程中判断了边界,但本蒟蒻觉得边界判定太麻烦,所以开始将整张地图从0到11全部设为“ * ”(即障碍),再从1开始读入数据到10,之后再在移动过程中判断障碍即可。
经过处理后的样例如下:
************
**...*.....*
*......*...*
*...*...*..*
*..........*
*...*.F....*
**.....*...*
*...*......*
*..C......**
*...*.*....*
*.*.*......*
************
3.移动
大佬们的代码在移动上好像有点多余,其实只用判断FarmerJohn和Cows的方向和在这个方向上前一格上有没有障碍,如果无障碍,向那个方向前进一格;如果有障碍,改变方向(方向+1,如果大于4,就更新为1)。但是,移动方向得特别注意,我在这里调了10分钟!
所以我们可以写出FarmerJohn的移动代码:
void fjmove() {
if(fjd==1&&maps[fjx-1][fjy]!='*') fjx=fjx-1;
else if(fjd==2&&maps[fjx][fjy+1]!='*') fjy=fjy+1;
else if(fjd==3&&maps[fjx+1][fjy]!='*') fjx=fjx+1;
else if(fjd==4&&maps[fjx][fjy-1]!='*') fjy=fjy-1;
else if(fjd!=4) fjd=fjd+1;
else fjd=1;
}
相似的,我们也可以写出Cows的移动代码:
void comove() {
if(cod==1&&maps[cox-1][coy]!='*') cox=cox-1;
else if(cod==2&&maps[cox][coy+1]!='*') coy=coy+1;
else if(cod==3&&maps[cox+1][coy]!='*') cox=cox+1;
else if(cod==4&&maps[cox][coy-1]!='*') coy=coy-1;
else if(cod!=4) cod=cod+1;
else cod=1;
}
注:变量fjx,fjy分别指FarmerJohn的xy坐标,变量fjd表示FarmerJohn的方向。变量cox,coy分别指Cows的xy坐标,变量cod指Cows的方向
4.判断相遇
判断是否会相遇其实很简单,只需要设置一个比较大的值(我这里用10000),当时间大于它时,就跳出循环,然后输出0就行了。
就像这样:
while(((fjx!=cox)||(fjy!=coy))&&timee<10000) {
......
}
if(timee==10000) cout<<"0";
else cout<<timee;
注:变量timee指FarmerJohn抓住Cows的时间。
其他也没有什么需要注意的了,上代码:
#include<bits/stdc++.h>
using namespace std;
char maps[1005][1005];
int fjx,fjy,fjd=1,cox,coy,cod=1,timee=0;
//direction:
//North:1
//East:2
//South:3
//West:4
void fjmove() {
if(fjd==1&&maps[fjx-1][fjy]!='*') fjx=fjx-1;
else if(fjd==2&&maps[fjx][fjy+1]!='*') fjy=fjy+1;
else if(fjd==3&&maps[fjx+1][fjy]!='*') fjx=fjx+1;
else if(fjd==4&&maps[fjx][fjy-1]!='*') fjy=fjy-1;
else if(fjd!=4) fjd=fjd+1;
else fjd=1;
}
void comove() {
if(cod==1&&maps[cox-1][coy]!='*') cox=cox-1;
else if(cod==2&&maps[cox][coy+1]!='*') coy=coy+1;
else if(cod==3&&maps[cox+1][coy]!='*') cox=cox+1;
else if(cod==4&&maps[cox][coy-1]!='*') coy=coy-1;
else if(cod!=4) cod=cod+1;
else cod=1;
}
int main() {
for(int i=0;i<=11;i++)
for(int j=0;j<=11;j++)
maps[i][j]='*';
for(int i=1;i<=10;i++)
for(int j=1;j<=10;j++)
cin>>maps[i][j];
for(int i=1;i<=10;i++)
for(int j=1;j<=10;j++)
if(maps[i][j]=='F')
fjx=i,fjy=j;
for(int i=1;i<=10;i++)
for(int j=1;j<=10;j++)
if(maps[i][j]=='C')
cox=i,coy=j;
while(((fjx!=cox)||(fjy!=coy))&&timee<10000) {
fjmove();
comove();
timee+=1;
}
if(timee==10000) cout<<"0";
else cout<<timee;
return 0;
}
样例运行图:


浙公网安备 33010602011771号