P1518 模拟详细题解

题目:https://www.luogu.com.cn/problem/P1518

思路 :用二维数组存下整张地图,把边界与题意所说之处标记为障碍物,再用两个一维数组表示往哪个方向走,依照题意模拟行走,若人与牛在某一时刻处于同一位置,那么说明成功找到,输出结果,那么什么时候是找不到呢?可以把循环设置非常多次,若退出循环时还未追到,可以认为无法追到。

以下是ac代码(附详细注释)

#include<iostream>
#include<map>
#include<cmath>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define lop(i,a,b) for(int i=(a);i<(b);i++)
#define dwn(i,a,b) for(int i=(a);i>=(b);i--)
#define el '\n'
using LL = long long;
char a[12][12];//地图
int cnt = 0, flag = 1;
int dx[4] = { -1,0,1,0 }, dy[4] = { 0,1,0,-1 };//分别模拟朝北东南西运动
int x11, x22, y11, y22;//1是我,2是牛 
void dfs()
{
	int idx1 = 0, idx2 = 0;
	rep(i, 1, 100000000)
	{
		if (x11 == x22 && y11 == y22)
		{
			flag = 0;//意味着找到
			break;
		}
		if (a[x11 + dx[idx1]][y11 + dy[idx1]] == '*')//是障碍,就改变方向
			idx1++;
		else
			x11 = x11 + dx[idx1], y11 = y11 + dy[idx1];//否则就移动
		if (a[x22 + dx[idx2]][y22 + dy[idx2]] == '*')
			idx2++;
		else
			x22 = x22 + dx[idx2], y22 = y22 + dy[idx2];
		idx1 %= 4, idx2 %= 4;//记得转四下相当于回到原来的方向
		cnt++;
	}
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	rep(i, 0, 11)
	{
		rep(j, 0, 11)
		{
			if (i == 0 || j == 0 || i == 11 || j == 11)
			{
				a[i][j] = '*';
				continue;
			}
			cin >> a[i][j];
			if (a[i][j] == 'F')
				x11 = i, y11 = j;//记录我的起始坐标
			if (a[i][j] == 'C')
				x22 = i, y22 = j;//记录牛的起始坐标
		}
	}
	dfs();
	if (!flag)
		cout << cnt << el;//若找到输出次数
	else
		cout << "0" << el;
	return 0;
}

  • 13
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值