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

我的AC评测记录

样例运行图:

谢谢大家!

posted @ 2022-03-06 19:38  TheCedar  阅读(234)  评论(1)    收藏  举报