| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1860 人关注过本帖, 1 人收藏
标题:关于用栈解迷宫的算法
取消只看楼主 加入收藏
lwlls668
Rank: 2
等 级:论坛游民
帖 子:59
专家分:72
注 册:2010-4-9
结帖率:100%
收藏(1)
已结贴  问题点数:50 回复次数:5 
关于用栈解迷宫的算法
#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
int nums[100][100];//储存迷宫的数据,0代表可以通过,1代表有障碍物
int line,row;// line代表多少列,row 代表多少行
struct node
{
    int x;//代表当前节点的x坐标
    int y;//y坐标
    struct node*next;//指向下个节点
    struct node*tail;//指向前一个节点
};
void insert(node*top,int i,int j)//插入新位置,向前走一步
{
    node*n;
    n=(node*)malloc(sizeof(node));
    n->x=j;
    n->y=i;
    n->next=NULL;
    n->tail=top;
    top->next=n;
    top=n;
}
void delet(node*top)//出栈,把当前的节点删除掉,向后退一步
{
    node*p=top;
    top=p->tail;
    free(p);
}
int move(node*top)//判断每个位置的走向可能,按顺时针搜寻,返回不同的int
{
    int i=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);
    if(top->y+1!=top->tail->y&&nums[top->x][top->y+1]==0)//如果top的y+1不等于上一步的y,就是说没有往回走循环。还要判断这个方向的nums[][]==0 才能走这条路,这是第二种情况,返回2;
            return  (i=2);
    if(top->x-1!=top->tail->x&&nums[top->x-1][top->y]==0)
            return (i=3);
    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<99;i++)//初始化,把周围的当成是1  那就不用判断是否出界了
        for(j=0;j<99;j++)
            nums[i][j]=1;
    for(i=1;i<=row;i++)
        for(j=1;j<=line;j++)
            scanf("%d",&nums[i][j]);
    head=(node*)malloc(sizeof(node));//第一步,在起点,栈的开始
    head->next=head->tail=NULL;
    head->x=head->y=1;
    top=head;
    while(top->x!=line||top->y!=row)//当没达到终点,循环
    {
        switch(move(top))
        {
        case 0:
            if(top->tail==NULL)//如果当前是原点,而且move(top)返回的是0,说明当前没有出路了。其它的返还值对应操作
            {
                printf("没路了");
                exit(0);
            }
            else
            {
                nums[top->x][top->y]=1;
                delet(top);// 如果不是第一个点,出栈
               
            }
             break;
        case 1://如果这个点符合条件,入栈,把下一个点作为前方探路点(向这个方向走了一步)
            insert(top,top->x+1,top->y);
            break;
        case 2:
            insert(top,top->x,top->y+1);
            break;
        case 3:
            insert(top,top->x-1,top->y);
            break;
        case 4:
            insert(top,top->x,top->y-1);
            break;
        }
    }            
    return 0;
}
这是自己写的,原理很简单,就是利用栈的特性一步步搜索下去。
我想了很久也没想出哪儿错了,我希望能先找出这个的问题再看更好的方法,希望谁能帮我看看,应该是指针出错了,我指针不懂。
谢谢了。
搜索更多相关主题的帖子: 算法 解迷宫 
2010-11-05 23:55
lwlls668
Rank: 2
等 级:论坛游民
帖 子:59
专家分:72
注 册:2010-4-9
收藏
得分:0 
  回溯,我不知道哪错了。感觉这样是最普通方法,但这个我都不知道怎么错了。郁闷呀
2010-11-06 00:58
lwlls668
Rank: 2
等 级:论坛游民
帖 子:59
专家分:72
注 册:2010-4-9
收藏
得分:0 
o(︶︿︶)o     先不说话,自己继续找,这儿继续等。希望谁能告诉我哪儿是致命的错误。谢谢了。
2010-11-06 11:56
lwlls668
Rank: 2
等 级:论坛游民
帖 子:59
专家分:72
注 册:2010-4-9
收藏
得分:0 
创建5*5迷宫矩阵
验证输出迷宫矩阵
 1 1 1 1 1 1 1
 1 0 0 1 1 0 1
 1 1 0 1 0 0 1
 1 0 0 1 0 1 1
 1 1 0 1 0 0 1
 1 1 0 0 0 0 1
 1 1 1 1 1 1 1
输入迷宫的入口;
1 1
验证0
输入迷宫的出口:
5 1
x2=5 y2=1
请按任意键继续. . .



我还不知道4楼的是不是有点问题,你一来就把“后路”堵死了,那如果一最初是判断错误了方向,正确结果是要通过这个点的另一个方向,而你却把这个点都堵死了,那也就是说你不可能再走这个点的正确的方向,结果不就是NO PATH!了吗。还有,我很难理解你建立坐标是x,y颠倒的···其它的可以。

回到我的问题,我还没找出我哪错了···
2010-11-06 12:28
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
lwlls668
Rank: 2
等 级:论坛游民
帖 子:59
专家分:72
注 册:2010-4-9
收藏
得分:0 
其实我还不知道递归这回事···郁闷
2010-11-13 21:44
快速回复:关于用栈解迷宫的算法
数据加载中...
 
   



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

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