C++ 遭遇战

【问题描述】
小林和小华在一个 n×n的矩形方格里玩游戏,矩形左上角为(0,0),右下角为(n−1,n−1)。

两人同时进入地图的随机位置,并以相同速度进行走位。为了隐蔽性,两人都不会再走自己走过的格子。如果两人向某一方向前进,那么他们会跑到不能跑为止,当不能跑的时候,小林会向右转,小华则会向左转,如果不能跑,则不再动。现在已知两人进入地图的初始位置和方向,请算出两人遭遇的位置。

【输入格式】
第 1 行 1 个正整数 t,表示测试数据组数,1≤t≤10。

接下来的 t 组数据,每组数据的第1行包含 1 个整数n,1≤n≤1000。

第 2 行包含 3 个整数x、y和d,表示小林的初始位置和一开始跑的方向。其中,d=0 表示东; d=1 表示南;d=2 表示西;d=3 表示北。

第 3 行与第 2 行格式相同,但描述的是小华。

【输出格式】
输出 t 行,若会遭遇,则包含两个整数,表示他们第一次相遇格子的坐标,否则输出“-1”。

【输入样例】

2
2
0 0 0
0 1 2
4
0 1 0
3 2 0

【输出样例】

-1
1 3

code<代码>

#include<bits/stdc++.h>
#define maxn 1005
using namespace std;
int v1[maxn][maxn],v2[maxn][maxn];
int d[4][2]={
   {
   0,1},{
   1,0},{
   0,-1},{
   -1,0}};//东 南  西  北  每个方向做的事情 提前准备好 
int main()
{
   
	int t,n,xl,yl,dl,xh,yh,dh,u,v,fl=0,fh=0,i;
	cin>>t;
	while (t--) {
   //多组数据  每组开始前,一切归零 
		cin>>n;
		cin>>xl>>yl>>dl;
		cin>>xh>>yh>>dh;
		if(xl==xh && yl==yh)
		{
   
			cout<<xh<<" "<<yh<<endl;
			continue;
		} 
		memset(v1,0,sizeof(v1));//数组清零 
		memset(v2,0,sizeof(v2));
		fl=0;fh=0;
		v1[xl][yl]=1;
		v2[xh][yh]=1; 
		while(1)
		{
   
			if(fl==0)
			{
   
				for(i=1;i<=4;i++)
				{
   
					u=xl+d[dl][0];
					v=yl+d[dl][1];
					if(u>=0 && u<=n-1 && v>=0 && v<=n-1 && v1[u][v]==0)//不越界 点没走过 
						{
   
							xl=u; 
							yl=v;
							v1[u][v]=1;
							break;
						}
					else//越界 走过  不能走 
						dl=(dl+1)%4;
				}
				if(i>4) fl=1;
			} 
	        if(fh==0)
				{
   
					for(i=1;i<=4;i++)
					{
   
						u=xh+d[dh][0];
						v=yh+d[dh][1];
						if(u>=0 && u<=n-1 && v>=0 && v<=n-1 && v2[u][v]==0)//不越界 点没走过 
							{
   
								xh=u; 
								yh=v;
								v2[u][v]=1;
								break;
							}
						else//越界 走过  不能走 
							{
   dh=(dh-1);
							  if(dh<0)dh=3;
							}
					}
					if(i>4) fh=1;
				} 
			if(xl==xh && yl==yh)
			{
   
			  cout<<xh<<" "<<yh<<endl;
			  break;
			}
			else
			{
   
				if(fl==1 && fh==1)
				{
   
					cout<<-1<<endl;
					break;
				}	  
			}  
		}	
	
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

༺Blog༒Hacker༻

您的鼓励将是我更新最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值