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

终止条件:两者相遇,并且在该分钟末尾。然后计算时间。
判断方法:如果两个物体先后两次从同一个方向走到同一个地点,我们就可以说它们陷入了死循环。这边可以通过生成专属值的方法来判断:农夫的x坐标+他的y坐标* 10+奶牛的x坐标* 100+奶牛的y坐标* 1000+农夫的方向* 10000+奶牛的方向* 40000(农夫方向最多为4)

#include<bits/stdc++.h>
using namespace std;
char m[12][12]; //地图
int f[3],c[3],ans,zsz; //农夫,奶牛,秒数,专属值
// f[0]代表方向 f[1]代表x坐标 f[2]代表y坐标
bool zt[160005]; //记录专属值是否出现
void move(int x,int y,int dir,int type) //x,y为x,y坐标,dir为方向,type为类型:农夫为0,奶牛为1
{
    if(dir==0){
        if(m[x][y+1]=='*') if(type==0) f[0]=1; else c[0]=1;
        else if(type==0) f[2]++; else c[2]++;
    }else if(dir==1){
        if(m[x+1][y]=='*') if(type==0) f[0]=2; else c[0]=2;
        else if(type==0) f[1]++; else c[1]++;
    }else if(dir==2){
        if(m[x][y-1]=='*') if(type==0) f[0]=3; else c[0]=3;
        else if(type==0) f[2]--; else c[2]--;
    } else{
        if(m[x-1][y]=='*') if(type==0) f[0]=0; else c[0]=0;
        else if(type==0) f[1]--; else c[1]--;
    }
}
bool pd(){ //判断循环终止条件:如果奶牛坐标与农夫坐标相等,则他们重叠,返回0,退出循环
    if (f[1]==c[1]&&f[2]==c[2]) return 0;
    else return 1;
}

int main()
{
    for(int i=0;i<=11;i++) m[i][0]='*',m[i][11]='*';
    for(int i=1;i<=10;i++) m[0][i]='*',m[11][i]='*';
    for(int i=10;i>=1;i--){   //这边WA了一下 要注意从上到下读入二维数组
        for(int j=1;j<=10;j++){
            cin>>m[j][i];
            if(m[j][i]=='F') f[1]=j,f[2]=i;
            if(m[j][i]=='C') c[1]=j,c[2]=i;
        }
    }
    while (pd()){ //模拟每秒
        zsz=f[1]+f[2]*10+c[1]*100+c[2]*1000+f[0]*10000+c[0]*40000;
        if(zt[zsz]){ //死循环了就输出0并结束程序
            cout<<0<<endl;
            return 0;
        }
        zt[zsz]=1;
        move(f[1],f[2],f[0],0); //依次移动农夫和奶牛
        move(c[1],c[2],c[0],1);
        ans++;
    }
    cout<<ans<<endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
回答: 题目P1518 \[USACO2.4\] 两只塔姆沃斯牛是一道模拟题,题目要求判断Farmer John和两头牛是否会相遇。解题思路可以分为两种方法。一种方法是记录二者的状态,如果出现了与前面相同的状态则说明陷入了死循环。具体实现步骤可以使用数组来记录Farmer John和两头牛的坐标、方向等状态信息,然后判断是否出现了重复的状态。另一种方法是利用博弈的思想,如果二者会同时回到一种状态,那么说明他们不会再相遇了,因为这时候他们已经陷入了一种对称性的状态。通过判断是否存在一种线性关系,可以确定二者是否会相遇。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [P1518 [USACO2.4]两只塔姆沃斯牛 The Tamworth Two](https://blog.csdn.net/TD123456q/article/details/125688037)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [洛谷P1518 [USACO2.4]两只塔姆沃斯牛 The Tamworth Two 题解 (C/C++)](https://blog.csdn.net/Jason__Jie/article/details/115027619)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [(移动方向状态标志)P1518 [USACO2.4]两只塔姆沃斯牛 The Tamworth Two题解](https://blog.csdn.net/m0_57221330/article/details/119980758)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值