洛谷P1518 两只塔姆沃斯牛

1.构建地图 (矩阵读入)矩阵边缘围上一圈障碍物;
2.模拟F和C的运动
    先判断前方是否有障碍物
    如果没有障碍物,前进一步
    如果有障碍物,改变方向
    向北:x-1,y;
    向东:x, y+1;
    向南:x+1,y;
    向西:x, y-1;
    表示方向0北,1东,2南,3西//用数组表示方向dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
3.判断是否相遇,如果相遇,输出步数,退出循环
4.如果死循环,输出0
    多维数组储存情况,两者重复经过同一情况,说明永不可相遇
    先后两次从同一方向经过同一地点,死循环

#include<iostream>
#include<algorithm>
#include<string.h>
#define IOS std::ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
using namespace std; 
typedef long long ll;
int s[25][25],dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
typedef struct node{//有三种属性,使用结构体 
	int x,y,f;//f表示方向,0北,1东,2南,3西; 
}node;
node cow,farmer;//定义两个结构体 
void tmove(){
	//判断前方是不是障碍 
	int fx=farmer.x+dx[farmer.f],fy=farmer.y+dy[farmer.f];//农夫的下一位置 
	int cx=cow.x+dx[cow.f],cy=cow.y+dy[cow.f];
	if(s[fx][fy]){//如果是1,进入if;如果是0,不进入 
		farmer.x=fx;
		farmer.y=fy;
	}
	else farmer.f=(farmer.f+1)%4;//转向 
	//cow的情况 
	if(s[cx][cy]){
		cow.x=cx;
		cow.y=cy;
	}
	else cow.f=(cow.f+1)%4;
}
bool mark[11][11][4][11][11][4];//判断是否John和cow是否都经过了此情况
int main(){
	IOS;//cin,cout加速器 
	char tmpc;//暂时代表字符进行判断 
	int timek=0;//移动时间 
	for(int i=1;i<=10;i++){//构建地图 
		for(int j=1;j<=10;j++){
			cin>>tmpc;//读入字符 
			if(tmpc=='*')continue;//障碍,不做变化 
			s[i][j]=1;//空地,能走为1 
			//读入cow的位置,方向 
			if(tmpc=='C'){
				cow.x=i;
				cow.y=j;
				cow.f=0;
			}
			//读入farmer的位置,方向 
			if(tmpc=='F'){
				farmer.x=i;
				farmer.y=j;
				farmer.f=0;
			}
		}
	}
	while(farmer.x!=cow.x||farmer.y!=cow.y){//模拟运动 
		timek++;
		if(mark[farmer.x][farmer.y][farmer.f][cow.x][cow.y][cow.f]==1){
			cout<<0;
			return 0;
		} 
		mark[farmer.x][farmer.y][farmer.f][cow.x][cow.y][cow.f]=1;//这种情况已经发生,记录为1 
		tmove();
	}
	cout<<timek;
  	return 0;
}


 

回答: 题目P1518 \[USACO2.4\] 两只塔姆沃斯牛是一道模拟题,题目要求判断Farmer John和两头牛是否会相遇。解题思路可以分为两种方法。一种方法是记录二者的状态,如果出现了与前面相同的状态则说明陷入了死循环。具体实现步骤可以使用数组来记录Farmer John和两头牛的坐标、方向等状态信息,然后判断是否出现了重复的状态。另一种方法是利用博弈的思想,如果二者会同时回到一种状态,那么说明他们不会再相遇了,因为这时候他们已经陷入了一种对称性的状态。通过判断是否存在一种线性关系,可以确定二者是否会相遇。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [P1518 [USACO2.4]两只塔姆沃斯牛 The Tamworth Two](https://blog.csdn.net/TD123456q/article/details/125688037)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [洛谷P1518 [USACO2.4]两只塔姆沃斯牛 The Tamworth Two 题解 (C/C++)](https://blog.csdn.net/Jason__Jie/article/details/115027619)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [(移动方向状态标志)P1518 [USACO2.4]两只塔姆沃斯牛 The Tamworth Two题解](https://blog.csdn.net/m0_57221330/article/details/119980758)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值