section 2.4.1 ttwo

这道题是要求两者相遇的时间。总共就四个方向,而且一个方向接着另一个方向,可以用一个子函数来求某一点的下一个位置,并用结构体将点坐标以及方向,是否变向存放起来。但是会有不相遇的情况,不相遇有多种情况,可以是两者会经过他们的初始点然后一直绕圈子,那就判断一下两者经过多次的绕圈是否会在同一时间经过他们的初始点;或者是不经过初始点进行绕圈,或者是像布朗运动一样乱走,但是两者就不相遇。所以最简单的方法就可以设置一个最大值,当时间一旦大于这个最大值,就认为两者不相遇。代码如下。

#include<bits/stdc++.h>
#define maxn 160000
using namespace std;
struct name{
	int x;
	int y;
	int loca;
	bool cha;
}name;
int ori[15][15];
struct name next(int x,int y,int loca){
	struct name re;
	re.cha=false;
	re.x=x;
	re.y=y;
	re.loca=loca;
	if (loca==1){
		if ((ori[x-1][y])||x==1){
			re.loca=2;
			re.cha=true;
		}
		else re.x-=1;
	}
	else if (loca==2){
		if ((ori[x][y+1])||y==10){
			re.loca=3;
			re.cha=true;
		}
		else re.y+=1;
	}
	else if (loca==3){
		if ((ori[x+1][y]||x==10)){
			re.loca=4;
			re.cha=true;
		}
		else re.x+=1;
	}
	else {
		if ((ori[x][y-1])||y==1){
			re.loca=1;
			re.cha=true;
		}
		else re.y-=1;
	}
	return re;
}
int main (){
	freopen ("ttwo.in","r",stdin);
	freopen ("ttwo.out","w",stdout);
	struct name ansc;
	struct name ansf;
	ansc.loca=1;
	ansc.cha=false;
	ansf.loca=1;
	ansf.cha=false;
	memset(ori,0,sizeof(ori));
	int xc=0,xf=0,yc=0,yf=0,cnt=0;
	char in=' ';
	for (int i=1;i<=10;i++){
		for (int j=1;j<=10;j++){
			cin>>in;
			if (in=='*'){
				ori[i][j]=1;
			}
			else if (in=='C'){
				ansc.x=i;
				ansc.y=j;
			}
			else if (in=='F'){
				ansf.x=i;
				ansf.y=j;
			}
		}
	}
	bool flag=false;
	while (!flag){
		ansc=next(ansc.x,ansc.y,ansc.loca);
		ansf=next(ansf.x,ansf.y,ansf.loca);
		if (ansc.x==ansf.x&&ansc.y==ansf.y){
			cout<<(cnt+1)<<endl;
			flag=true;
		}
		cnt++;
		if (cnt>maxn){
			cout<<0<<endl;
			flag=true;
		}
	}
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值