求大佬详解一下为啥题解中专属值这么求,萌新瑟瑟发抖
查看原帖
求大佬详解一下为啥题解中专属值这么求,萌新瑟瑟发抖
342874
刘奶奶喝水呢楼主2021/3/26 21:07
#include<iostream>
#include<algorithm>
#include<cstring>
#include<math.h>
#include<iomanip>
using namespace std;

char m[12][12];
int c[3], f[3], ans, tdz;    //f[0]和c[0]用来存方向
bool zt[160005];  

void move(int x, int y, int mi, int h) {     //x,y为x,y坐标,mi为方向,h为类型:农夫为0,奶牛为1
    if (mi == 0) {  //初始向北
        if (m[x - 1][y] == '*') if (h == 0) f[0] = 1; else c[0] = 1;
        else if (h == 0) f[1]--; 
        else c[1]--;
    }
    else if (mi == 1) { //东
        if (m[x][y + 1] == '*') if (h == 0) f[0] = 2; else c[0] = 2;
        else if (h == 0) f[2]++;
        else c[2]++;
    }
    else if (mi == 2) { //南
        if (m[x + 1][y] == '*') if (h == 0) f[0] = 3; else c[0] = 3;
        else if (h == 0) f[1]++; 
        else c[1]++;
    }
    else if (mi == 3) { //西
        if (m[x][y - 1] == '*') if (h == 0) f[0] = 0; else c[0] = 0;
        else if (h == 0) f[2]--; 
        else c[2]--;
    }
}

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 <= 11; i++) m[0][i] = '*', m[11][i] = '*';
    for (int i = 1; i <= 10; i++) {
        for (int j = 1; j <= 10; j++) {
            cin >> m[i][j];
            if (m[i][j] == 'C') {
                c[1] = i;
                c[2] = j;
            }
            if (m[i][j] == 'F') {
                f[1]= i;
                f[2] = j;
            }
        }
    }

    while (pd()) {//模拟每秒
        tdz = f[1] + f[2] * 10 + c[1] * 100 + c[2] * 1000 + f[0] * 10000 + c[0] * 40000;     //依旧不知道为啥这样就不重复了,就能判断是否两次同一方向经过同一地点
        if (zt[tdz]) {//死循环了就输出0并结束程序
            cout << 0 << endl;
            return 0;
        }
        zt[tdz] = 1;//标记
        move(f[1], f[2], f[0], 0);
        move(c[1], c[2], c[0], 1);//依次移动农夫和奶牛
        ans++;//记录秒数
    }
    cout << ans << endl;//输出
    return 0;
}
2021/3/26 21:07
加载中...