码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构--书上代码用栈求解迷宫问题存在BUG(非最优解)

时间:2016-05-12 21:56:16      阅读:351      评论:0      收藏:0      [点我收藏+]

标签:

数据结构第四版p79页迷宫问题我觉得存在BUG,下图盗用贺老师就会的QAQ,也希望贺老师能看到帮忙解答一下啦。

BUG:  程序从起始点(1,1)开始寻找路径,在当前点进行判断其上下左右是否存在可走点,如果从(1,1)点开始判断如图那么它的右(1,2)下(2,1)都是可走点那么将右边的格子坐标进栈呢还是将下边的格子坐标进栈?书本上给的代码是先判断上边格子再判断右边格子再判断下边格子再判断左边格子,这就造成了一个问题:(1,2)则个点会被进栈(因为(1,2)点位于(1,1)点的右边被先判断进栈),那么接下来的路径会变成固定的(1,1)->(1,2)->(2,2)->(3,2)->(3,3)->(3,4)->(2,4)->(1,4)->(1,5)->(1,6)->(2,6)->(2,5)

这样的话就会到(2,5)就会停止,根本不会达到查找其他路径的目的。

技术分享

技术分享

-------------------------------------------------

#include<iostream>
#include<malloc.h>
#define MaxSize 100
using namespace std;
typedef struct
{
    int i;
    int j;
    int di;
} Box;
typedef struct
{
    Box data[MaxSize];
    int top;
} StType;
  int mg[10][10]=
        {
            {1,1,1,1,1,1,1,1,1,1},
            {1,0,0,1,0,0,0,1,0,1},
            {1,0,0,1,0,0,0,1,0,1},
            {1,0,0,0,0,1,1,0,0,1},
            {1,0,1,1,1,0,0,0,0,1},
            {1,0,0,0,1,0,0,0,0,1},
            {1,0,1,0,0,0,1,0,0,1},
            {1,0,1,1,1,0,1,1,0,1},
            {1,1,0,0,0,0,0,0,0,1},
            {1,1,1,1,1,1,1,1,1,1}
        };
bool mgpath(int xi,int yi,int xe,int ye)
{
    int i,j,k,di,find;
    StType st;
    st.top=-1;
    st.top++;
    st.data[st.top].i=xi;
    st.data[st.top].j=yi;
    st.data[st.top].di=-1;
    mg[xi][yi]=-1;
    while(st.top>-1)
    {
        i=st.data[st.top].i;
        j=st.data[st.top].j;
        di=st.data[st.top].di=-1;
        if(i==xe&&j==ye)
        {
            cout<<"迷宫路径如下:"<<endl;
            for(k=0; k<=st.top; k++)
            {
                cout<<"("<<st.data[k].i<<","<<st.data[k].j<<")";
                if((k+1)%5==0)
                    cout<<endl;
                }
            cout<<endl;
            return true;
        }
        find=0;
        while(di<4&&find==0)
        {
            di++;
            switch(di)
            {
            case 0:
                i=st.data[st.top].i-1;
                j=st.data[st.top].j;
                break;
            case 1:
                i=st.data[st.top].i;
                j=st.data[st.top].j+1;
                break;
            case 2:
                i=st.data[st.top].i+1;
                j=st.data[st.top].j;
                break;
            case 3:
                i=st.data[st.top].i;
                j=st.data[st.top].j-1;
                break;
            }
            if(mg[i][j]==0)
                find=1;
        }
        if(find==1)
        {
            st.data[st.top].di=di;
            st.top++;
            st.data[st.top].i=i;
            st.data[st.top].j=j;
            st.data[st.top].di=-1;
            mg[i][j]=-1;
        }
        else
        {
            mg[st.data[st.top].i][st.data[st.top].j]=0;
            st.top--;
        }
    }
    return false;
}
int main()
{
   mgpath(1,1,3,1);

}



 

目的点为(2,5)时
技术分享

==============================

目的点为(3,1)时

技术分享

 

数据结构--书上代码用栈求解迷宫问题存在BUG(非最优解)

标签:

原文地址:http://blog.csdn.net/huangyong000/article/details/51355105

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!