| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1860 人关注过本帖, 1 人收藏
标题:关于用栈解迷宫的算法
只看楼主 加入收藏
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
收藏
得分:0 
就对你输入的这个来说,出口 5 1的数组值为1 是为障碍物 肯定是通不过了,我的整体思路就是在探索中把不为障碍的进栈,如果最后行不通就把栈顶元素初出栈 入栈是为了保留当前探索路径,出栈是最终这个路径不通,如果你把出口设置成 5 5那肯定是有通路的,你可以把我注释掉的都去掉注释,一步步调试,就会明白了
2010-11-06 17:19
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:30 
#include <stdio.h>
#include <stdlib.h>

int nums[25][80];//储存迷宫的数据,0代表可以通过,1代表障碍物
int line, row;// line代表多少列,row 代表多少行

struct node
{
    int x;//代表当前节点的x坐标
    int y;//y坐标
    struct node*next;//指向下个节点
    struct node*tail;//指向前一个节点
};

node* insert(node *top, int i, int j)//插入新位置,向前走一步
{
    node *n;
    n = (node*)malloc(sizeof(node));
    n->x = i;
    n->y = j;
    n->next = NULL;
    n->tail = top;
    top->next = n;
    top = n;
    //
    nums[j][i] = 1;
    //
    return top;
}
node* delet( node *top )//出栈,把当前的节点删除掉,向后退一步
{
    node * p = top;
    top = p->tail;
    //top->next = NULL;
    free(p);
    return top;
}
int move( node *top )//判断每个位置的走向可能,按顺时针搜寻,返回不同的int
{
    int i=0;
    if( nums[top->y][top->x+1]==0 )//if( top->x+1!=top->tail->x && nums[top->x+1][top->y]==0 )
    {//如果top的x+1不等于上一步的x,就是说没有往回走循环。还要判断这个方向的nums[][]==0 才能走这条路,这是第一种情况,返回1;
        return (i=1);/****向右****/
    }
    else if( nums[top->y+1][top->x]==0 )//else if( top->y+1!=top->tail->y && nums[top->x][top->y+1]==0 )
    {//如果top的y+1不等于上一步的y,就是说没有往回走循环。还要判断这个方向的nums[][]==0 才能走这条路,这是第二种情况,返回2;
            return  (i=2);/****向下****/
    }
    else if( nums[top->y][top->x-1]==0 )//else if( top->x-1!=top->tail->x && nums[top->x-1][top->y]==0 )
    {
            return (i=3);/****向左****/
    }
    else if( nums[top->y-1][top->x]==0 )//else if( top->y-1!=top->tail->y && nums[top->x][top->y-1]==0 )
    {
            return  (i=4);/****向上****/
    }
    return i;//当上面的假设都不成立就代表四周都不能走了,返回0;
}
int main()
{
    int i,j;
    node *head, *top;//head只是保留初始点,top才是最远的一个点

    printf("请输入一共有多少行?多少列?");
    scanf("%d%d", &row, &line);
    for( i=0; i<25; i++ )//初始化,把周围的当成是1  那就不用判断是否出界了
        for( j=0; j<80; j++ )
            nums[i][j] = 1;
    for( i=1; i<=row; i++ )
        for( j=1; j<=line; j++ )
            scanf("%d",&nums[i][j]);

        printf("输入终点:"); scanf("%d%d",&line, &row);
    head = (node*)malloc(sizeof(node));//第一步,在起点,栈的开始
    head->next = head->tail = NULL;
    head->x = head->y = 1;/////////////////////////////////////////////////
    top = head;
    while( top->y!= row || top->x!= line)//当没达到终点,循环
    {   
        i = move(top);
        switch( i )
        {
        case 0:
            if( top == NULL )
            {//如果当前是原点,而且move(top)返回的是0,说明当前没有出路了。其它的返还值对应操作
                printf("没路了!\n");
                exit(0);
            }
            else
            {
                    //nums[top->x][top->y] = 1;
                    top = delet(top);// 如果不是第一个点,出栈
            }
             break;
        case 1://如果这个点符合条件,入栈,把下一个点作为前方探路点(向这个方向走了一步)
            top = insert(top, top->x+1, top->y);
            break;
        case 2:
            top = insert(top, top->x, top->y+1);
            break;
        case 3:
            top = insert(top, top->x-1, top->y);
            break;
        case 4:
            top = insert(top, top->x, top->y-1);
            break;
        }
    }
    while( top )
    {
        printf("( %d, %d )\n", top->x, top->y);
        top = top->tail;
    }
    return 0;
}
2010-11-06 18:21
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册


2010-11-06 18:23
lwlls668
Rank: 2
等 级:论坛游民
帖 子:59
专家分:72
注 册:2010-4-9
收藏
得分:0 
太感谢你们了,我终于明白了。
上面的那个case 0:
            if( top == NULL )
          还是改回去 (top->tail=NULL)吧。
0  1  0  0  1
0  0  0  0  0
1  1  1  1  1
1  1  0  1  0
1  0  0  1  0
你可以试一试这个。
  //
    nums[j][i] = 1;
    //
这个好,我本来还想再用一个判断的····
谢谢了~~~~~~
2010-11-06 23:57
outsider_scu
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:430
专家分:1333
注 册:2010-10-21
收藏
得分:0 
话说我今天看到了一个用递归求解的算法。实在精辟,只有短短几行。。

编程的道路上何其孤独!
2010-11-07 10:36
Alar30
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:10
帖 子:988
专家分:1627
注 册:2009-9-8
收藏
得分:0 
膜拜一下哇。。。
2010-11-07 11:05
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
收藏
得分:0 
以下是引用outsider_scu在2010-11-7 10:36:06的发言:

话说我今天看到了一个用递归求解的算法。实在精辟,只有短短几行。。

能否麻烦你贴出来分享下呢
2010-11-07 11:13
outsider_scu
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:430
专家分:1333
注 册:2010-10-21
收藏
得分:0 
以下是引用遮天云在2010-11-7 11:13:24的发言:

 
能否麻烦你贴出来分享下呢#include <stdio.h>
#include <stdlib.h>
#define error printf("error\n")
#define m 6
#define n 8
typedef struct {
    int x,y;
}item;  /* 定义方向的数据类型*/
int maze[m+2][n+2]={
    {1,1,1,1,1,1,1,1,1,1},
    {1,0,1,1,1,0,1,1,1,1},
    {1,0,0,0,0,1,1,1,1,1},
    {1,0,1,0,0,0,0,0,1,1},
    {1,0,1,1,1,0,0,1,1,1},
    {1,1,0,0,1,1,0,0,0,1},
    {1,0,1,1,0,0,1,1,0,1},
    {1,1,1,1,1,1,1,1,1,1}
};
int path(int maze[m+2][n+2],item *move,int x,int y)
{   /*递归函数,表示从(x,y)点找到下一个点*/
    int i;
    maze[x][y]=-1;    /*用-1标志走过的路*/
    if(x==m&&y==n)    /*如果到了出口,结束递归,打印出口点。*/
    {
        printf("%d,%d)<-",x,y);
        return 1;
    }
    for(i=0;i<4;i++)   
    {  /*探索四个方向*/
        if(maze[x+move[i].x][y+move[i].y]==0)
        {  /*当前方向可以走。*/
            maze[x+move[i].x][y+move[i].y]=-1; /*用-1标志走过的路*/
            if(path(maze,move,x+move[i].x,y+move[i].y))  /*递归调用,求子问题*/
            {
                printf("(%d,%d)<-",x,y);   /*反向打印所走的路*/
                return 1;
            }
            maze[x+move[i].x][y+move[i].y]=0;  /*此路不通,还原迷宫*/
        }
    }
    return 0;
}
void main()
{
    int i,j;
    item move[4]={0,1,1,0,0,-1,-1,0};
    if(path(maze,move,1,1));
    else printf("no way!\n");
}
给。

编程的道路上何其孤独!
2010-11-07 13:30
outsider_scu
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:430
专家分:1333
注 册:2010-10-21
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <stdlib.h>
#define error printf("error\n")
#define m 6
#define n 8
typedef struct {
    int x,y;
}item;  /* 定义方向的数据类型*/
int maze[m+2][n+2]={
    {1,1,1,1,1,1,1,1,1,1},
    {1,0,1,1,1,0,1,1,1,1},
    {1,0,0,0,0,1,1,1,1,1},
    {1,0,1,0,0,0,0,0,1,1},
    {1,0,1,1,1,0,0,1,1,1},
    {1,1,0,0,1,1,0,0,0,1},
    {1,0,1,1,0,0,1,1,0,1},
    {1,1,1,1,1,1,1,1,1,1}
};
int path(int maze[m+2][n+2],item *move,int x,int y)
{   /*递归函数,表示从(x,y)点找到下一个点*/
    int i;
    maze[x][y]=-1;    /*用-1标志走过的路*/
    if(x==m&&y==n)    /*如果到了出口,结束递归,打印出口点。*/
    {
        printf("%d,%d)<-",x,y);
        return 1;
    }
    for(i=0;i<4;i++)  
    {  /*探索四个方向*/
        if(maze[x+move[i].x][y+move[i].y]==0)
        {  /*当前方向可以走。*/
            maze[x+move[i].x][y+move[i].y]=-1; /*用-1标志走过的路*/
            if(path(maze,move,x+move[i].x,y+move[i].y))  /*递归调用,求子问题*/
            {
                printf("(%d,%d)<-",x,y);   /*反向打印所走的路*/
                return 1;
            }
            maze[x+move[i].x][y+move[i].y]=0;  /*此路不通,还原迷宫*/
        }
    }
    return 0;
}
void main()
{
    int i,j;
    item move[4]={0,1,1,0,0,-1,-1,0};
    if(path(maze,move,1,1));
    else printf("no way!\n");
}
这。。。

编程的道路上何其孤独!
2010-11-07 13:31
sunmingchun
Rank: 4
来 自:安徽-滁州
等 级:业余侠客
帖 子:198
专家分:277
注 册:2010-4-2
收藏
得分:0 
不错 先收了 有时间看看
2010-11-07 19:56
快速回复:关于用栈解迷宫的算法
数据加载中...
 
   



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

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