鱼C论坛

 找回密码
 立即注册
查看: 2981|回复: 11

队列迷宫问题,迷宫通路代码没问题,迷宫没有通路,段错误发生?在线等答案啊?

[复制链接]
发表于 2012-6-15 10:05:59 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 下y1页的对白 于 2012-6-15 10:42 编辑


#include<stdio.h>

#define MCOL 5
#define MROW 5
typedef struct data
{
    int row;
    int col;
    int pre;
}VNODE;

VNODE queue[1024];
int head = 0;
int tail = 0;

int maze[MCOL][MROW] =
{
    {0,1,0,0,0},
    {0,1,0,1,0},
    {0,0,0,0,1},
    {0,1,1,1,0},
    {0,0,0,1,0}

};

void print_maze(void)
{
    int i=0;
    int j=0;

    putchar('\n');
    for(j=0; j<MCOL; j++)
    {
        for(i=0; i<MROW; i++)
        {
            printf("%3d", maze[j]);
        }
        putchar('\n');
    }
    putchar('\n');
}

void enqueue(VNODE p)
{
    queue[tail++] = p;
}

VNODE dequeue(void)
{
    return queue[head++];
}

int isempty(void)
{
    return(head == tail);
}

void visit(int r, int c)
{
    VNODE s = {r, c, head-1};
    maze[c][r] = 2;
    enqueue(s);
}

int main(int argc, const char *argv[])
{
    VNODE p = {0, 0, -1};
    enqueue(p);
    maze[0][0] = 2;

    while (!isempty()) {
    //while (1) {
        p = dequeue();

        if((p.row == MROW-1) && (p.col == MCOL-1))
        {
            break;
        }
        if(((p.row-1) >= 0) && (maze[p.row-1][p.col] == 0))   
        {
            visit(p.row-1, p.col); //left
        }

        if(((p.col+1)<MCOL)&&(maze[p.row][p.col+1] == 0))
        {
            visit(p.row, p.col+1);  //down
        }

        if(((p.row+1)<MROW)&&(maze[p.row+1][p.col] == 0))
        {
            visit(p.row+1, p.col); //right
        }
        if(((p.col-1)>=0)&&(maze[p.row][p.col-1] == 0))   
        {
            visit(p.row, p.col-1); //up
        }

    }

    print_maze();

    if((p.col == MCOL-1) && (p.row == MROW-1)) {
        printf("(%d, %d)\n", p.row, p.col);
        while (p.pre != -1) {
            p = queue[p.pre];
            printf("(%d, %d)\n", p.row, p.col);
        }
    }else
        printf("no path\n");
    return 0;
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-6-15 10:06:00 | 显示全部楼层
  1. #include<stdio.h>

  2. #define MCOL 5
  3. #define MROW 5

  4. typedef struct data
  5. {
  6.     int row;
  7.     int col;
  8.     int pre;
  9. }VNODE;

  10. VNODE queue[10240];
  11. int head = 0;
  12. int tail = 0;

  13. int maze[MCOL][MROW] =
  14. {
  15.     {0,1,0,0,0},
  16.     {0,1,0,1,0},
  17.     {0,0,0,0,0},
  18.     {0,1,1,1,0},
  19.     {0,0,0,1,0}

  20. };

  21. void print_maze(void)
  22. {
  23.     int i=0;
  24.     int j=0;

  25.     putchar('\n');
  26.     for(j=0; j<MCOL; j++)
  27.     {
  28.         for(i=0; i<MROW; i++)
  29.         {
  30.             printf("%3d", maze[j][i]);
  31.         }
  32.         putchar('\n');
  33.     }
  34.     putchar('\n');
  35. }

  36. void enqueue(VNODE p)
  37. {
  38.     queue[tail++] = p;
  39. }

  40. VNODE dequeue(void)
  41. {
  42.     return queue[head++];
  43. }

  44. int isempty(void)
  45. {
  46.     return(head == tail);
  47. }

  48. void visit(int r, int c)
  49. {
  50.     VNODE s = {r, c, head-1};
  51.     maze[c][r] = 2;
  52.     enqueue(s);
  53. }

  54. int main(int argc, const char *argv[])
  55. {
  56.     VNODE p = {0, 0, -1};
  57.    
  58.     enqueue(p);
  59.    
  60.     maze[0][0] = 2;

  61.     while (!isempty()) {
  62.     //while (1) {
  63.                
  64.         p = dequeue();

  65.         if((p.row == MROW-1) && (p.col == MCOL-1))
  66.         {
  67.             break;
  68.         }
  69.         if(((p.row-1) >= 0) && (maze[p.col][p.row-1] == 0))   
  70.         {
  71.             visit(p.row-1, p.col); //left
  72.         }

  73.         if(((p.col+1)<MCOL)&&(maze[p.col+1][p.row] == 0))
  74.         {
  75.             visit(p.row, p.col+1);  //down
  76.         }

  77.         if(((p.row+1)<MROW)&&(maze[p.col][p.row+1] == 0))
  78.         {
  79.             visit(p.row+1, p.col); //right
  80.         }
  81.         if(((p.col-1)>=0)&&(maze[p.col-1][p.row] == 0))   
  82.         {
  83.             visit(p.row, p.col-1); //up
  84.         }

  85.     }
  86.        
  87.     print_maze();

  88.     if((p.col == MCOL-1) && (p.row == MROW-1)) {
  89.         printf("(%d, %d)\n", p.row, p.col);
  90.         while (p.pre != -1) {
  91.             p = queue[p.pre];
  92.             printf("(%d, %d)\n", p.row, p.col);
  93.         }
  94.     }else
  95.                 printf("no path\n");
  96.   
  97.     return 0;
  98. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-6-15 11:38:16 | 显示全部楼层
弱弱的问下 迷宫出口在哪
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-15 11:49:30 | 显示全部楼层

非通路
int maze[MCOL][MROW] =
{
     {0,1,0,0,0},
     {0,1,0,1,0},
     {0,0,0,0,1},
     {0,1,1,1,0},
     {0,0,0,1,0}

};
通路
int maze[MCOL][MROW] =
{
     {0,1,0,0,0},
     {0,1,0,1,0},
     {0,0,0,0,0},
     {0,1,1,1,0},
     {0,0,0,1,0}

};起点(0,0)终点(4,4)
谢谢了  急用啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-6-15 12:46:00 | 显示全部楼层
  1. void print_maze(void)
  2. {
  3.     int i=0;
  4.     int j=0;

  5.     putchar('\n');
  6.     for(j=0; j<MCOL; j++)
  7.     {
  8.         for(i=0; i<MROW; i++)
  9.         {
  10.            // printf("%3d", maze[j]);打印迷宫
  11.             printf("%3d", maze[j][i]);
  12.         }
  13.         putchar('\n');
  14.     }
  15.     putchar('\n');
  16. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-15 15:34:49 | 显示全部楼层

打印迷宫是对的 我上面打漏了,现在程序的问题是,迷宫如果有出口则没有错误,如果迷宫没有出口则会显示段错误。不是迷宫的打印问题, 你再看看吧  谢谢了啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-6-15 16:12:19 | 显示全部楼层
下y1页的对白 发表于 2012-6-15 15:34
打印迷宫是对的 我上面打漏了,现在程序的问题是,迷宫如果有出口则没有错误,如果迷宫没有出口则会显示段 ...

为什么我的可以显示no  path
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-15 16:43:52 | 显示全部楼层
wangyexin 发表于 2012-6-15 16:12
为什么我的可以显示no  path

你用什么编译运行的,我是linux下gcc编译。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-6-15 18:27:09 | 显示全部楼层
xp dev C++
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-6-15 20:36:48 | 显示全部楼层
本帖最后由 wangyexin 于 2012-6-15 20:51 编辑

终于发现问题了,你有的地方行列写反了,导致没去重,然后访问了非法内存
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-15 22:08:05 | 显示全部楼层

谢谢咯哈。这下对了,但是我想这样修改,只是修改了打印的坐标,原来的程序打印的是数组的行列坐标,这样修改后,即是将行列坐标换成我们熟悉的xy 坐标了,可以这样理解吗?还是想不通那里重复了,你给说明一下吧


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-6-17 20:39:43 | 显示全部楼层
下y1页的对白 发表于 2012-6-15 22:08
谢谢咯哈。这下对了,但是我想这样修改,只是修改了打印的坐标,原来的程序打印的是数组的行列坐标,这样 ...
  1. while (!isempty()) {

  2. 75.    //while (1) {

  3. 76.               

  4. 77.        p = dequeue();

  5. 78.

  6. 79.        if((p.row == MROW-1) && (p.col == MCOL-1))

  7. 80.        {

  8. 81.            break;

  9. 82.        }

  10. 83.        if(((p.row-1) >= 0) && (maze[p.col][p.row-1] == 0))   

  11. 84.        {

  12. 85.            visit(p.row-1, p.col); //left

  13. 86.        }

  14. 87.

  15. 88.        if(((p.col+1)<MCOL)&&(maze[p.col+1][p.row] == 0))

  16. 89.        {

  17. 90.            visit(p.row, p.col+1);  //down

  18. 91.        }

  19. 92.

  20. 93.        if(((p.row+1)<MROW)&&(maze[p.col][p.row+1] == 0))

  21. 94.        {

  22. 95.            visit(p.row+1, p.col); //right

  23. 96.        }

  24. 97.        if(((p.col-1)>=0)&&(maze[p.col-1][p.row] == 0))   

  25. 98.        {

  26. 99.            visit(p.row, p.col-1); //up

  27. 100.        }

  28. 101.

  29. 102.    }

复制代码
你这里坐标写反了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-12 23:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表