两只塔姆沃斯牛 The Tamworth Two

题目描述

两只牛逃跑到了森林里。Farmer John 开始用他的专家技术追捕这两头牛。你的任务是模拟他们的行为(牛和 John)。

追击在 10 \times 1010×10 的平面网格内进行。一个格子可以是:一个障碍物,两头牛(它们总在一起),或者 Farmer John。两头牛和 Farmer John 可以在同一个格子内(当他们相遇时),但是他们都不能进入有障碍的格子。

一个格子可以是:

. 空地;
* 障碍物;
C 两头牛;
F Farmer John。
这里有一个地图的例子:

*…*…
…*…
…*…*…

…*.F…
*…*…
…*…
…C…*
…*.*…
.*.*…
牛在地图里以固定的方式游荡。每分钟,它们可以向前移动或是转弯。如果前方无障碍(地图边沿也是障碍),它们会按照原来的方向前进一步。否则它们会用这一分钟顺时针转 90 度。 同时,它们不会离开地图。

Farmer John 深知牛的移动方法,他也这么移动。

每次(每分钟)Farmer John 和两头牛的移动是同时的。如果他们在移动的时候穿过对方,但是没有在同一格相遇,我们不认为他们相遇了。当他们在某分钟末在某格子相遇,那么追捕结束。

读入十行表示地图。每行都只包含 10 个字符,表示的含义和上面所说的相同。保证地图中只有一个 F 和一个 C。F 和 C 一开始不会处于同一个格子中。

计算 Farmer John 需要多少分钟来抓住他的牛,假设牛和 Farmer John 一开始的行动方向都是正北(即上)。 如果 John 和牛永远不会相遇,输出 0。

输入格式

输入共十行,每行 10 个字符,表示如上文描述的地图。

输出格式

输出一个数字,表示 John 需要多少时间才能抓住牛们。如果 John 无法抓住牛,则输出 0。

输入输出样例

输入





.F…


…C…

.
..

输出

49

题解:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
const int maxn = 12;
// 存储地图信息,0表示障碍物,1表示无障碍
int mp[maxn][maxn];
// 存储农民的坐标
int fx, fy;
// 存储牛的坐标
int cx, cy;
// 农名的方向,开始时方向向北
int fdir = 0;
// 牛的方向,开始时方向向北
int cdir = 0;
// 表示移动的方向,分别表示向北,东,南,西走
int x[4] = {-1, 0, 1,  0};
int y[4] = { 0, 1, 0, -1};
// 存储牛和人在当前坐标的状态, a为1标记该状态出现
// 1, 2表示人的横纵坐标 3表示人的方向信息(0, 1, 2, 3分别表示北, 东, 南, 西)
// 4, 5表示牛的横纵坐标 6表示牛的方向信息(同上)
int a[maxn][maxn][maxn][maxn][maxn][maxn];
// 模拟人和牛的移动状态,t表示时间信息
void cal(int t) {
    // 写出递归结束的条件
    // 如果牛和人的坐标相等,代表相遇了
    if(fx == cx && fy == cy) {
        cout << t << endl;
        return;
    }
    // 此状态已经出现过1次了,再次出现时代表会重复原来的步骤,应该退出,表示牛和人不可能相遇
    if(a[fx][fy][fdir][cx][cy][cdir] == 1) {
        cout << 0 << endl;
        return;
    }
    a[fx][fy][fdir][cx][cy][cdir] = 1;
    // 如果判断人下一步的走向
    if(mp[fx + x[fdir]][fy + y[fdir]] == 0) {
        fdir = (fdir + 1) % 4;
    } else {
        fx += x[fdir];
        fy += y[fdir];
    }
    // 如果判断牛下一步的走向
    if(mp[cx + x[cdir]][cy + y[cdir]] == 0) {
        cdir = (cdir + 1) % 4;
    } else {
        cx += x[cdir];
        cy += y[cdir];
    }
    cal(t + 1);
}
int main() {
    for(int i = 1; i <= 10; i++) {
        for(int j = 1; j <= 10; j++) {
            char ch;
            cin >> ch;
            if(ch == '.') {
                mp[i][j] = 1;
            } else if(ch == 'F') {
                // 记录农民的初始坐标
                mp[i][j] = 1;
                fx = i;
                fy = j;
            } else if(ch == 'C') {
                // 记录牛的初始坐标
                mp[i][j] = 1;
                cx = i;
                cy = j;
            }
        }
    }
    cal(0);
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值