永发信息网

c语言迷宫问题,以一个m×n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。

答案:2  悬赏:70  手机版
解决时间 2021-12-03 19:51
c语言迷宫问题,以一个m×n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。
最佳答案
说一下我的想法吧
1 把初始点放入一个队列
2 出队列->获取该点的上下左右坐标,并且是有意义的坐标(不超出边界,不是障碍)
3 将 2 获取的点 判断是不是终点 是结束 不是继续
4 将 2 获取的点 加入队列 重复 234步骤

有些细节可以需要注意,可能你要排除重复的点不加入该队列 不然会造成上下点死循环
全部回答
#define STACK_SIZE 1000
#define TRUE 1
#define FALSE 0

#include 

short DIRECTION_UP = 1;
short DIRECTION_RIGHT = 1 << 1;
short DIRECTION_DOWN = 1 << 2;
short DIRECTION_LEFT = 1 << 3;
short ALL_DIRECTIONS = DIRECTION_UP | DIRECTION_RIGHT | DIRECTION_DOWN | DIRECTION_LEFT;

typedef struct {
  int x;
  int y;
  short directions;
} Cell;

typedef struct {
  Cell elem[STACK_SIZE];
  int top;
} Stack;

void initStack(Stack *s) {
  s->top = -1;
}

int isEmpty(Stack *s) {
  return (s->top == -1 ? TRUE : FALSE);
}

void push(Stack *s, Cell e) {
  s->top++;
  s->elem[s->top] = e;
}

void pop(Stack *s, Cell *e) {
  *e = s->elem[s->top];
  s->top--;
}

int hasDirection(Cell *e, short d) {
  return (e->directions & d) != 0 ? 1 : 0;
}

void removeDirection(Cell *e, short d) {
  e->directions = e->directions & (~d);
}

int main() {
  int i, j;
  int m, n;
  int entranceX, entranceY, exitX, exitY;
  scanf("%d %d", &m, &n);
  short a[m][n];
  short visited[m][n];
  for (i = 0; i < m; i++) {
    for (j = 0; j < n; j++) {
      scanf("%d", &a[i][j]);

      visited[i][j] = 0;
    }
  }
  scanf("%d %d %d %d", &entranceX, &entranceY, &exitX, &exitY);

  Stack steps;
  initStack(&steps);
  Cell e;
  e.y = entranceX;
  e.x = entranceY;
  e.directions = ALL_DIRECTIONS;

  push(&steps, e);
  visited[entranceX][entranceY] = 1;
  while (!isEmpty(&steps)) {
    pop(&steps, &e);
    if (e.x == exitX && e.y == exitY) {
      push(&steps, e);
      break;
    }

    if (e.x > 0 && hasDirection(&e, DIRECTION_UP) && a[e.x - 1][e.y] == 0 && !visited[e.x - 1][e.y]) {
      removeDirection(&e, DIRECTION_UP);
      push(&steps, e);
      e.x--;
      e.directions = ALL_DIRECTIONS;
      removeDirection(&e, DIRECTION_DOWN);
      push(&steps, e);
      visited[e.x][e.y] = 1;
    } else if (e.y < n - 1 && hasDirection(&e, DIRECTION_RIGHT) && a[e.x][e.y + 1] == 0 && !visited[e.x][e.y + 1]) {
      removeDirection(&e, DIRECTION_RIGHT);
      push(&steps, e);
      e.y++;
      e.directions = ALL_DIRECTIONS;
      removeDirection(&e, DIRECTION_LEFT);
      push(&steps, e);
      visited[e.x][e.y] = 1;
    } else if (e.x < m - 1 && hasDirection(&e, DIRECTION_DOWN)
        && a[e.x + 1][e.y] == 0 && !visited[e.x + 1][e.y]) {
      removeDirection(&e, DIRECTION_DOWN);
      push(&steps, e);
      e.x++;
      e.directions = ALL_DIRECTIONS;
      removeDirection(&e, DIRECTION_UP);
      push(&steps, e);
      visited[e.x][e.y] = 1;
    } else if (e.y > 0 && hasDirection(&e, DIRECTION_LEFT)
        && a[e.x][e.y - 1] == 0 && !visited[e.x][e.y - 1]) {
      removeDirection(&e, DIRECTION_LEFT);
      push(&steps, e);
      e.y--;
      e.directions = ALL_DIRECTIONS;
      removeDirection(&e, DIRECTION_RIGHT);
      push(&steps, e);
      visited[e.x][e.y] = 1;
    }
  }

  if (isEmpty(&steps)) {
    printf("No");
  } else {
    printf("Yes");
  }

  return 0;
}追问谢谢大神,最近没看到,等下试试
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
初中化学溶液计算公式
1月23日为什么全球重要股票指数猛栽
别人告我猥亵罪不成立我可以起诉他污告罪吗
梦到自己老婆许给别人
桌子上有2双鞋子的英文句子
梦到家里养的鱼从鱼缸里出来离开水以后变成了
大麦青计过期1个月左右能喝吗?
现在微商太多了好做吗
面墙是什么意思
手机屏幕的“单点触控”和“两点触控”所起的
谁知道奥铃捷运车速比调调整器在什么位置?麻
千寻发饰美甲在什么地方啊,我要过去处理事情
求小说女主叫莫相离男主叫景柏然
东光附近哪有卖博远玉米联合机器的
不知道的情况下收脏,,公安机关怎么处理
推荐资讯
猜谜语,猫冬(打一字)
种植马蹄亩产量多少公斤?
国家规定的电子表每月误差是多少
合唱团共有162人,平均分成3组,每组平均6行。1
马的鞭有多大多长图片
能帮忙看下这个房子的风水吗?一梯三户的中间
3点7千瓦电机为什么电流只有4安培
有外地初中学校吗
在理发店上班洗头发,老板是应该给员工买护手
常熟市125cc踏板车要驾驶证不
什么叫绝夫罡
阜宁县芦蒲派出所地址在哪?我要去那里办事
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?