专栏文章

题解:P1518 [USACO2.4] 两只塔姆沃斯牛 The Tamworth Two

P1518题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mioszm51
此快照首次捕获于
2025/12/03 00:39
3 个月前
此快照最后确认于
2025/12/03 00:39
3 个月前
查看原文

题解:P1518 [USACO2.4] 两只塔姆沃斯牛 The Tamworth Two

题意:
在一个 10210^{2} 的方格内,农夫和牛每分钟动个一次,他们会沿着当前方向走直到遇到障碍物或越界,然后顺时针旋转 9090 度。
终止条件:
  • 农夫和牛在‌同一格‌相遇,输出‌相遇时间‌。
  • 如果‌ 10001000 分钟‌后仍未相遇,输出‌ 00‌
解题思路:
  1. 计算下一步的坐标
  2. 检查是否‌越界‌或遇到‌障碍物‌:
    • 如果‌可以走‌,则更新位置。
    • 如果‌不能走‌,则‌顺时针旋转方向‌ cd=(cd+1)cd = (cd + 1) % 4
  3. 检查‌是否相遇‌:
    • 如果相遇,直接返回当前时间。
    • 否则继续循环。

代码实现

一道模拟题 首先记录 FFCC 的初始位置然后用方向数组储存四个方向的坐标变化。模拟循环 t=1t=1t=1000t=1000,并更新农夫和牛的位置。 最后检查一下边界就行了。

代码

CPP
#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<string> v(10);
    int fx,fy,fd=0; // 农夫位置和方向
    int cx,cy,cd=0; // 牛的位置和方向
    // 读取输入并初始化位置
    for(int i=0;i<10;i++) {
        getline(cin,v[i]);
        for(int j=0; j<10;j++) {
            if(v[i][j]=='F') {
                fx=i;fy=j;
            }
            if(v[i][j]=='C') {
                cx=i;cy=j;
            }
        }
    }
    // 方向数组:北、东、南、西
    int dx[5]={-1,0,1,0};
    int dy[5]={0,1,0,-1};
    
    for(int t=1;t<=1000;t++) {
        // 农夫的移动
        int fxx=fx+dx[fd],fyy=fy+dy[fd];
        if(fxx>=0&&fxx<10&&fyy>=0&&fyy<10&&v[fxx][fyy]!='*') {
            fx=fxx;fy=fyy;
        } 
		else{
            fd=(fd+1)%4;
        }
        // 牛移动
        int cxx=cx+dx[cd],cyy=cy+dy[cd];
        if(cxx>=0&&cxx<10&&cyy>=0&&cyy<10&&v[cxx][cyy]!='*') {
            cx=cxx;cy=cyy;
        } 
		else{
            cd=(cd+1)%4;
        }
        if(fx==cx&&fy==cy) {
            cout<<t<<endl;
            return 0;
        }
    }
    cout<<0<<endl;
    return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...