题目: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;
}