Select Code
#include<iostream>
#include<string>
int b[4][2] = { {-1,0},{0,1},{1,0},{0,-1} };
int x1, y, x2, y2,c,d;
char a[11][11];
using namespace std;
int main()
{
void pp1(int, int);
void pp2(int, int);
int N; cin >> N; getchar();
while (N--)
{
c = 0, d = 0;
for (int i = 0; i < 10; i++)
for (int j = 0; j < 10; j++)
{
cin >> a[i][j];
if (a[i][j] == 'c') x1 = i, y = j;
if (a[i][j] == 'm') x2 = i, y2 = j;
}
int i;
for (i = 1; i <= 10000000; i++)
{
pp1(x1, y);
pp2(x2, y2);
if (x1 == x2&&y == y2)
{
cout << i << endl; break;
}
}
if (i == 10000001) cout << '0' << endl;
}
return 0;
}
void pp1(int j, int k)
{
if (a[j + b[c][0]][k + b[c][1]] == '*')
{
if (c == 3) c = 0;
else c++;
}
else if (j + b[c][0] < 0 || j + b[c][0] >= 10 || k + b[c][1] < 0 || k + b[c][1] >= 10)
{
if (c == 3) c = 0;
else c++;
}
else
{
x1 = x1 + b[c][0]; y = y + b[c][1];
}
}
void pp2(int j, int k)
{
if (a[j + b[d][0]][k + b[d][1]] == '*')
{
if (d== 3) d = 0;
else d++;
}
else if (j + b[d][0] < 0 || j + b[d][0] >= 10 || k + b[d][1] < 0 || k + b[d][1] >= 10)
{
if (d== 3) d = 0;
else d++;
}
else
{
x2 = x2 + b[d][0]; y2 = y2 + b[d][1];
}
}
开始以为是广搜或深搜,回来清题目才发现这是一道纯粹的模拟题,这里开一个二维数组表示猫和老鼠的方向,用d++ c++控制方向。开始还在想怎么判断猫抓不到老鼠的情况,索性直接循环一千万次,如果还没抓到就判断永远抓不到,没想到这样也能ac.