猫和老鼠

【题目描述】
猫和老鼠在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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值