标题:深度优先用栈的方法实现
只看楼主
天霁
Rank: 2
等 级:论坛游民
帖 子:33
专家分:18
注 册:2015-7-17
结帖率:83.33%
已结贴  问题点数:20 回复次数:5 
深度优先用栈的方法实现
这里有两份代码,几乎一模一样,请问为什么一份能正常运行,一份却会IDE报错呢?
题目:迷宫找路,迷宫用数组表示,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的路线。
程序代码:
#include <stdio.h>

#define MAX_ROW 5
#define MAX_COL 5

struct point {int row,col;} stack[512];
int top=0;

void push(struct point p)
{
    stack[top++] = p;
}

struct point pop(void)
{
    return stack[--top];
}

int is_empty(void)
{
    return top == 0;
}

int maze[MAX_ROW][MAX_COL]={
    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,
};

void disp_maze(void)
{
    int i,j;
    for(i=0;i<MAX_ROW;i++)
    {
        for(j=0;j<MAX_COL;j++)
            printf("%2d",maze[i][j]);
        printf("\n");
    }
    printf("***********\n");
}

struct point predecessor[MAX_ROW][MAX_COL]={
    {{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}},
    {{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}},
    {{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}},
    {{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}},
    {{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}},
};

void visit(int row, int col, struct point pre)
{
    struct point visit_point={row,col};
    maze[row][col]=2;
    predecessor[row][col]=pre;
    push(visit_point);
}
int main(void)
{
    struct point p={0,0};

    maze[p.row][p.col]=2;
    push(p);
    while(!is_empty())
    {
        p=pop();
        if(p.row==MAX_ROW-1
            && p.col==MAX_COL-1)
            break;
        if(p.col+1<MAX_COL
            && maze[p.row][p.col+1]==0)
            visit(p.row,p.col+1,p);  //right
        if(p.row+1<MAX_ROW
            && maze[p.row+1][p.col]==0)
            visit(p.row+1,p.col,p); //down
        if(p.col-1>=0
            && maze[p.row][p.col-1]==0)
            visit(p.row,p.col-1,p); //left
        if(p.row-1>=0
            && maze[p.row-1][p.col]==0);
            visit(p.row-1,p.col,p);  //up
        disp_maze();
    }
    printf("Hello world!\n");//在while循环里就会IDE报错,所以就没往后写
    return 0;
}

第二份(正常)
程序代码:
#include <stdio.h>

#define MAX_ROW 5
#define MAX_COL 5

struct point { int row, col; } stack[512];
int top = 0;

void push(struct point p)
{
    stack[top++] = p;
}

struct point pop(void)
{
    return stack[--top];
}

int is_empty(void)
{
    return top == 0;
}

int maze[MAX_ROW][MAX_COL] = {
    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,
};

void print_maze(void)
{
    int i, j;
    for (i = 0; i < MAX_ROW; i++) {
        for (j = 0; j < MAX_COL; j++)
            printf("%d ", maze[i][j]);
        putchar('\n');
    }
    printf("*********\n");
}

struct point predecessor[MAX_ROW][MAX_COL] = {
    {{-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}},
    {{-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}},
    {{-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}},
    {{-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}},
    {{-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}},
};

void visit(int row, int col, struct point pre)
{
    struct point visit_point = { row, col };
    maze[row][col] = 2;
    predecessor[row][col] = pre;
    push(visit_point);
}

int main(void)
{
    struct point p = { 0, 0 };

    maze[p.row][p.col] = 2;
    push(p);    
    
    while (!is_empty()) {
        p = pop();
        if (p.row == MAX_ROW - 1  /* goal */
            && p.col == MAX_COL - 1)
            break;
        if (p.col+1 < MAX_COL     /* right */
            && maze[p.row][p.col+1] == 0)
            visit(p.row, p.col+1, p);
        if (p.row+1 < MAX_ROW     /* down */
            && maze[p.row+1][p.col] == 0)
            visit(p.row+1, p.col, p);
        if (p.col-1 >= 0          /* left */
            && maze[p.row][p.col-1] == 0)
            visit(p.row, p.col-1, p);
        if (p.row-1 >= 0          /* up */
            && maze[p.row-1][p.col] == 0)
            visit(p.row-1, p.col, p);
        print_maze();
    }
    if (p.row == MAX_ROW - 1 && p.col == MAX_COL - 1) {
        printf("(%d, %d)\n", p.row, p.col);
        while (predecessor[p.row][p.col].row != -1) {
            p = predecessor[p.row][p.col];
            printf("(%d, %d)\n", p.row, p.col);
        }
    } else
        printf("No path!\n");

    return 0;
}
搜索更多相关主题的帖子: row struct point int void 
2018-07-05 14:37
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:20 
你的代码在我这儿连编译都无法成功,唉
        if(p.row-1>=0
            && maze[p.row-1][p.col]==0);
这一句报错:';' : empty controlled statement found; is this the intent?
2018-07-05 14:43
天霁
Rank: 2
等 级:论坛游民
帖 子:33
专家分:18
注 册:2015-7-17
得分:0 
啊,眼瞎了,竟然多了个分号
2018-07-05 15:09
天霁
Rank: 2
等 级:论坛游民
帖 子:33
专家分:18
注 册:2015-7-17
得分:0 
谢谢
2018-07-05 15:10
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
以下是引用天霁在2018-7-5 15:09:54的发言:

啊,眼瞎了,竟然多了个分号

没看到多个分号,只是疏忽,谈不上“眼瞎”
编译器报错,看到却无动于衷,才是“心瞎”
2018-07-05 15:20
天霁
Rank: 2
等 级:论坛游民
帖 子:33
专家分:18
注 册:2015-7-17
得分:0 
回复 5楼 rjsp
我用vscode运行的时候,编译器没有报错,但是会弹出
2018-07-05 18:23



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-488398-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024238 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved