P1518 [USACO2.4]两只塔姆沃斯牛 The Tamworth Two

本文介绍了一种通过模拟方法解决农夫寻找牛的问题。利用二维数组记录地图,通过判断农夫和牛的方向及前方是否有障碍物来模拟它们的移动。通过设定最大步数避免无限循环,最终确定两者能否相遇及所需时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

得到几个重要信息:

  1. 农夫和牛每分钟内的行动方式都是:前方有障碍,顺时针旋转90°,前方无障碍,前进一步。
  2. 农夫和牛同时运动,并且具有方向。
  3. 地图边缘也属于障碍物。
  • 代码构思

模拟思路:用二维数组记录整张图,为防止越界同时让代码简短,把字符放在Farm[1][1]到Farm[10][10]里。用四个个变量记录农夫和牛的位置。每次只要对这些变量做出改变就行。

方向问题:农夫和牛都具有四个方向(向北,东,南,西),分别用数值1,2,3,4来代表四个方向。

1对北,2对东,3对南,4对西,这样对应是为了方便做拐弯(顺时针90°),用变量flag存储数值,如果遇到障碍就(flag=flag%4+1)实现1变2,2变3,3变4,4变1。

相遇问题:农夫和牛在图中最多各有400种状态(100个位置,每个位置有四个方向),也就是一张图最多出现400*400种情况,如果经过400*400分钟仍未相遇,就不能相遇。也可以设置一个很大的值当做临界点当做判断是否相遇的条件。

代码实现

#include<iostream>
using namespace std;
struct direction {
	int x;
	int y;
};//定义结构体记录牛和农夫位置(也可以不用结构体直接上四个变量)
direction farmer = { 0 }, cow = { 0 };//一牛一农夫
int main()
{
	int time = 0;
	int cowflag = 1, farmerflag = 1;//牛和农夫的方向,初始都向北,值为一
	char Farm[12][12] = { 0 };
	char c = '0';
	for (int i = 1; i <= 10; i++)
	{
		scanf("%s", Farm[i]+1);//存储到Farm[i][1——10]
		c = getchar();//防止读入空格
	}
	for (int i = 1; i <= 10; i++)//遍历找出牛和农夫的位置
	{
		for (int j = 1; j <= 10; j++)
		{
			if (Farm[i][j] == 'C')
			{
				cow.x = i; cow.y = j;
				Farm[i][j] = '.';//找到后可以把该位置置为空地
			}
			else if (Farm[i][j] == 'F')
			{
				farmer.x = i; farmer.y = j;
				Farm[i][j] = '.';//同理
			}
		}
	}
	for (time = 1; time <= 160000; time++)//模拟行动
	{
		//先判断方向并判断前方是不是空地'.'是的话可以向前走一步,否则拐弯
		//先写牛和农夫先后顺序随意
		if (cowflag == 1 && Farm[cow.x - 1][cow.y] == '.')cow.x--;
		else if (cowflag == 2 && Farm[cow.x][cow.y + 1] == '.')cow.y++;
		else if (cowflag == 3 && Farm[cow.x + 1][cow.y] == '.')cow.x++;
		else if (cowflag == 4 && Farm[cow.x][cow.y - 1] == '.')cow.y--;
		else cowflag = cowflag % 4 + 1;//拐弯
		if (farmerflag == 1 && Farm[farmer.x - 1][farmer.y] == '.')farmer.x--;
		else if (farmerflag == 2 && Farm[farmer.x][farmer.y + 1] == '.')farmer.y++;
		else if (farmerflag == 3 && Farm[farmer.x + 1][farmer.y] == '.')farmer.x++;
		else if (farmerflag == 4 && Farm[farmer.x][farmer.y - 1] == '.')farmer.y--;
		else farmerflag = farmerflag % 4 + 1;//同理
		if (farmer.x == cow.x && farmer.y == cow.y)break;//每次走完判断是否位置相同
	}
	if (time == 160001)printf("0");//经过160000后仍未相遇(160001是因为完整走完循环time++)
	else printf("%d", time);
	return 0;//完结撒花
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值