【题目描述】
猫和老鼠在10*10的方格中运动,例如:
……..
……*…
……..
……….
…*.C….
…..…
…*……
..M……*
….….
..……
C=猫(CAT)
M=老鼠(MOUSE)
*=障碍物
.=空地
猫和老鼠每秒中走一格,如果在某一秒末他们在同一格中,我们称他们“相遇”。
注意,“对穿”是不算相遇的。猫和老鼠的移动方式相同:平时沿直线走,下一步如果会走到障碍物上去或者出界,就用1秒的时间做一个右转90度。一开始他们都面向北方。
编程计算多少秒以后他们相遇。
【算法分析】
本题按照题目所讲模拟即可,但要注意的是数组从0还是1开始。
①定义结构体和计数变量。
②用gets整行读入
③循环判断寻找猫和老鼠
④定义 work函数,根据题意,记录步数。
⑤利用switch case来判断方向和计数。(注意数组范围)
【参考代码】
//猫和老鼠
#include <cstdio>
#include <iostream>
#include <cstdlib>
using namespace std;
struct Node
{
int x, y;//坐标
char pos;//方向
};
char array[10][11];
void MoveNext(struct Node* who)//方向的改变或者坐标的改变
{
switch (who->pos)//获取当前方位,决定下一步走向
{
case 'N':
if (who->x == 0 || array[who->x - 1][who->y] == '*')
who->pos = 'E';
else
who->x--;
break;
case 'S':
if (who->x == 9 || array[who->x + 1][who->y] == '*')
who->pos = 'W';
else
who->x++;
break;
case 'E':
if (who->y == 9 || array[who->x][who->y + 1] == '*')
who->pos = 'S';
else
who->y++;
break;
case 'W':
if (who->y == 0 || array[who->x][who->y - 1] == '*')
who->pos = 'N';
else
who->y--;
break;
}
}
int main()
{
int N, i, j, k, count;
struct Node Mouse, Cat;
gets(array[0]);//获取多余的回车符
for (j = 0; j < 10; j++)
gets(array[j]);
for (i = 0; i < 10; i++)读图,获取两人所在的位置并标记
for (j = 0; j < 10; j++)
{
if (array[i][j] == 'C')
{
Cat.x = i;
Cat.y = j;
Cat.pos = 'N';
}
else if (array[i][j] == 'M')
{
Mouse.x = i;
Mouse.y = j;
Mouse.pos = 'N';
}
}
count = 0;
//一百步之内或者未找到则继续找
while (count < 100 && (Mouse.x != Cat.x || Mouse.y != Cat.y))
{
MoveNext(&Mouse);
MoveNext(&Cat);
count++;
}
if(Mouse.x == Cat.x && Mouse.y == Cat.y)//到输出步数
printf("%d\n", count);
else//未找到
printf("-1\n");
return 0;
}