飙血推荐
  • HTML教程
  • MySQL教程
  • JavaScript基础教程
  • php入门教程
  • JavaScript正则表达式运用
  • Excel函数教程
  • UEditor使用文档
  • AngularJS教程
  • ThinkPHP5.0教程

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

时间:2022-01-23  作者:pannnn  
// Problem: P1518 [USACO2.4]两只塔姆沃斯牛 The Tamworth Two
// Contest: Luogu
// URL: https://域名.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;
}

标签:编程
湘ICP备14001474号-3  投诉建议:234161800@qq.com   部分内容来源于网络,如有侵权,请联系删除。