求助,44分
查看原帖
求助,44分
1433409
nankong2005楼主2025/1/16 14:45

f代表人,c代表牛,0存的方向,1,2是坐标,0,1,2,3代表北到西,tzz特征值看有没有出现过。

#include <bits/stdc++.h>
using namespace std;

bool tz(int f[], int c[]) {
    return !(f[1] == c[1] && f[2] == c[2]);
}

void move(int x, int y, int l, int h, char z[12][12], int f[], int c[]) {
    if (l == 0) {
        if (z[x-1][y] == '*') {
            if (h == 0) f[0] = 1; else c[0] = 1;
        } else {
            if (h == 0) f[1]--; else c[1]--;
        }
    } else if (l == 1) {
        if (z[x][y+1] == '*') {
            if (h == 0) f[0] = 2; else c[0] = 2;
        } else {
            if (h == 0) f[2]++; else c[2]++;
        }
    } else if (l == 2) {
        if (z[x+1][y] == '*') {
            if (h == 0) f[0] = 3; else c[0] = 3;
        } else {
            if (h == 0) f[1]++; else c[1]++;
        }
    } else {
        if (z[x][y-1] == '*') {
            if (h == 0) f[0] = 0; else c[0] = 0;
        } else {
            if (h == 0) f[2]--; else c[2]--;
        }
    }
}

int main() {
    char z[12][12];
    int f[3], c[3];
    int m = 0, tzz;
    int zt[1000086] = {0};

    for (int i = 1; i <= 10; i++) {
        for (int j = 1; j <= 10; j++) {
            cin >> z[i][j];
            if (z[i][j] == 'F') {
                f[1] = i; f[2] = j;
            }
            if (z[i][j] == 'C') {
                c[1] = i; c[2] = j;
            }
        }
    }

    while (tz(f, c)) {
        tzz = f[1] + f[2] * 10 + c[1] * 100 + c[2] * 1000 + f[0] * 10000 + c[0] * 40000;
        if (zt[tzz]) {
            cout << 0 << endl;
            return 0;
        }
        zt[tzz] = 1;

        move(f[1], f[2], f[0], 0, z, f, c);
        move(c[1], c[2], c[0], 1, z, f, c);

        m++;
    }

    cout << m << endl;
    return 0;
}
2025/1/16 14:45
加载中...