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;
}