ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-01-22 18:02:49  阅读:76  来源: 互联网

标签:humX humY P1518 int graph Tamworth 塔姆沃 cowY


// Problem: P1518 [USACO2.4]两只塔姆沃斯牛 The Tamworth Two
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1518
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// User: Pannnn

#include <bits/stdc++.h>

using namespace std;

// 获取图信息,保存牛和人的当前位置
// 读入时判断是否为字符F和C,使用单独的坐标存储人和牛的坐标,图中将字符替换为.
void getGraph(char (*graph)[15], int &cowX, int &cowY, int &humX, int &humY) {
    for (int i = 1; i <= 10; ++i) {
        for (int j = 1; j <= 10; ++j) {
            cin >> graph[i][j];
            if (graph[i][j] == 'F') {
                cowX = i;
                cowY = j;
                graph[i][j] = '.';
            } else if (graph[i][j] == 'C') {
                humX = i;
                humY = j;
                graph[i][j] = '.';
            }
        }
    }
}

int getRes(char (*graph)[15], int cowX, int cowY, int humX, int humY) {
    // 四个方向对应的x与y的偏移量,初始时人与牛都在下标为0对应的方向上
    int directCow = 0, directHum = 0;
    int dx[] = {-1, 0, 1, 0};
    int dy[] = {0, 1, 0, -1};
    /*
        判断是否能够相遇,可以在移动次数达到一定值时判定为无法相遇。
        另一种思路:设定一种状态,如果这个状态以前出现过,说明他们进入了循环,不能相遇。
        状态包括:人和牛的各自坐标x和y以及他们各自的方向。
    */
    // 图100个点,如果移动200次没有追上就不会再追上
    for (int i = 1; i <= 200; ++i) {
        // 判断牛当前前进方向的前一个点是否为障碍物
        // 是障碍物就改变其方向
        if (graph[cowX + dx[directCow]][cowY + dy[directCow]] == '*') {
            directCow = (directCow + 1) % 4;
        } else {
            // 否则牛向此方向前进
            cowX = cowX + dx[directCow];
            cowY = cowY + dy[directCow];
        }
        
        if (graph[humX + dx[directHum]][humY + dy[directHum]] == '*') {
            directHum = (directHum + 1) % 4;
        } else {
            humX = humX + dx[directHum];
            humY = humY + dy[directHum];
        }
        
        if (cowX == humX && cowY == humY) {
            return i;
        }
    }
    return 0;
}

int main() {
    char graph[15][15] = { 0 };
    // 图从[1,1]开始,且以*填充空白,简化越界判断
    fill(&graph[0][0], &graph[0][0] + sizeof(graph), '*');
    
    int cowX = -1, cowY = -1;
    int humX = -1, humY = -1;
    getGraph(graph, cowX, cowY, humX, humY);
    
    int res = getRes(graph, cowX, cowY, humX, humY);
    cout << res << endl;
    return 0;
}

标签:humX,humY,P1518,int,graph,Tamworth,塔姆沃,cowY
来源: https://www.cnblogs.com/pannnn/p/15834631.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有