专栏文章
题解: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
题意:
在一个 的方格内,农夫和牛每分钟动个一次,他们会沿着当前方向走直到遇到障碍物或越界,然后顺时针旋转 度。
终止条件:
- 农夫和牛在同一格相遇,输出相遇时间。
- 如果 分钟后仍未相遇,输出 。
解题思路:
-
计算下一步的坐标
-
检查是否越界或遇到障碍物:
-
如果可以走,则更新位置。
-
如果不能走,则顺时针旋转方向 。
-
-
检查是否相遇:
-
如果相遇,直接返回当前时间。
-
否则继续循环。
-
代码实现
代码
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 条评论,欢迎与作者交流。
正在加载评论...