| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3826 人关注过本帖
标题:迷宫问题?
只看楼主 加入收藏
雨中飛燕
Rank: 1
等 级:新手上路
帖 子:765
专家分:0
注 册:2007-10-13
收藏
得分:0 
楼主的数组发生了坐标混乱的情况。。。。

[color=white]
2008-05-06 11:31
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
猪头,应该顶八楼,那么牛的代码,还不赶快复制下来?

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-06 11:48
zjl138
Rank: 1
等 级:新手上路
威 望:1
帖 子:788
专家分:0
注 册:2007-11-12
收藏
得分:0 
[bo]以下是引用 [un]雨中飛燕[/un] 在 2008-5-6 11:31 的发言:[/bo]

楼主的数组发生了坐标混乱的情况。。。。

http://blog.

谢谢,刚吃饭去了。我再看一下。
还有感谢你的代码。
谢谢!!!

i like linux...
2008-05-06 11:50
zjl138
Rank: 1
等 级:新手上路
威 望:1
帖 子:788
专家分:0
注 册:2007-11-12
收藏
得分:0 
还是不行,首先这里有误:offsets move[8]={{-1,0,"N"},{-1,1,"NE"},{0,1,"E"},{1,1,"SE"},
    {1,0,"SE"},{1,-1,"SW"},{0,-1,"W"},{-1,-1,"NW"}};
改为:
offsets move[8]={{-1,0,"N"},{-1,1,"NE"},{0,1,"E"},{1,1,"SE"},
    {1,0,"S"},{1,-1,"SW"},{0,-1,"W"},{-1,-1,"NW"}};
再调试,设断点,发现几个问题:
(1)mark[g][h]的值一直都是 1 。
(2)提示d,move[i]为错误指针。
我试着对g,h,d变量初始化,但还是一样的结果。
会不会是我的逻辑的问题,我自已发现不了,还望大伙帮忙。
谢谢!!!

[[it] 本帖最后由 zjl138 于 2008-5-6 13:32 编辑 [/it]]

i like linux...
2008-05-06 13:21
雨中飛燕
Rank: 1
等 级:新手上路
帖 子:765
专家分:0
注 册:2007-10-13
收藏
得分:0 
第一,你没有标记边界,
第二,你的程序明显越界。。。

当然,第一是造成第二的原因

[color=white]
2008-05-06 13:31
zjl138
Rank: 1
等 级:新手上路
威 望:1
帖 子:788
专家分:0
注 册:2007-11-12
收藏
得分:0 
谢谢楼上,我是没有标记边界。
我再改改。

i like linux...
2008-05-06 13:37
zjl138
Rank: 1
等 级:新手上路
威 望:1
帖 子:788
专家分:0
注 册:2007-11-12
收藏
得分:0 
还是一样,可能我对飞燕姐提醒的“数组越界”没理解清楚。
我已设了边界,并试了极端的方法,把迷宫初始为零。可结果还是一样,找不到迷宫出口。
飞燕姐有空帮我再看一下代码吗,不好意思,叫你看我的代码可能是件很痛苦的事,写得太乱了,呵呵。或者对我这个程序,选成数组越界的原因说详细一点。
/********************************************************
** Highlight software by yzfy(雨中飞燕) http:// *
*********************************************************/
#include<iostream>
#include<ctime>
using namespace std;
const int m=12,p=15;          //迷宫的行数和列数
struct offsets              //前进方向表的结构定义
{
    int a,b;              //a,b是x,y(SeekPath函数参数)方向的偏移
    char *dir;              //dir是方向
};
offsets move[8];           //各个方向的偏移表
int Maze[m+2][p+2];       //迷宫定义
int mark[m+2][p+2];      //访问标记数组
int main()
{
    int SeekPath(int,int);
    int i,j;
    srand(unsigned(time(NULL)));

    offsets move[8]={{-1,0,"N"},{-1,1,"NE"},{0,1,"E"},{1,1,"SE"},
    {1,0,"S"},{1,-1,"SW"},{0,-1,"W"},{-1,-1,"NW"}};
    for(i=0;i<m+2;i++)               //用随机数产生迷宫
    {
        for(j=0;j<=p+1;j++)
            Maze[i][j]=rand()%2;
    }
    //设定行边界
    for(j=0;j<=p+1;j++)
    {
        Maze[0][j]=Maze[m+1][j]=1;
    }
    //设定列边界
    for(i=0;i<=m+1;i++)
    {
        Maze[i][0]=Maze[i][p+1]=1;
    }
    for(i=0;i<m+2;i++)                 //访问标记数组初始为零
        for(j=0;j<p+2;j++)
            mark[i][j]=0;
    cout<<"The maze is:"<<endl;         //输出刚才产生的迷宫
    for(i=0;i<m+2;i++)
    {
        for(j=0;j<p+2;j++)
            cout<<Maze[i][j];
        cout<<endl;
    }
    mark[1][1]=1;                    //从入口[1][1]开始
   
    if(SeekPath(1,1))                //调用求解迷宫的递归算法
        cout<<"("<<1<<","<<1<<"(,"<<"Direction"<<"E"<<endl;
    system("pause");
    return 0;
}
int SeekPath(int x,int y)
{
    //从迷宫某一位置开始,寻找通向出口[M][P]的一条路径。
    //如果找到,返回1,否刚返回0;
    //试探的出发点为[1][1].
    int i,g=0,h=0;                    //用G,H记录位置信息,D记方向
    char *d=NULL;
    if(x==m&&y==p)
        return 1;                     //到达出口,返回1;
    for(i=0;i<8;i++)
    {
        g=x+move[i].a;               
        h=y+move[i].b;
        d=move[i].dir;         //找下一位置和方向(a,b,dir)
        if(Maze[g][h]==0 && mark[g][h]==0)
        {
            mark[g][h]=1;
            if(SeekPath(g,h))                  //从此位置递归试探
            {
                cout<<"("<<g<<","<<h<<"),"<<"Direction"<<d<<",";
                return 1            //试探成功,逆向输出路径坐标
            }
        }
    }
    if(x==1&&y==1)
        cout<<"no path in Maze"<<endl;
    return 0;
}


[[it] 本帖最后由 zjl138 于 2008-5-6 14:37 编辑 [/it]]

i like linux...
2008-05-06 14:35
zjl138
Rank: 1
等 级:新手上路
威 望:1
帖 子:788
专家分:0
注 册:2007-11-12
收藏
得分:0 
再想了一下,迷宫初始化为零都不行,那应该是mark[i][j]这个标记数组有地方不行了,调试也一直显示mark[g][h]=1;导致这里一直过不去:
if(Maze[g][h]==0 && mark[g][h]==0)
        {
            mark[g][h]=1;
            if(SeekPath(g,h))                  //从此位置递归试探
            {
                cout<<"("<<g<<","<<h<<"),"<<"Direction"<<d<<",";
                return 1            //试探成功,逆向输出路径坐标
可mark[g][h]怎么会一直都是1呢?
我试输出了offsets move[8],迷宫,都能正常输出。
调试时还是这样:
(1)mark[g][h]的值一直都是 1 。
(2)提示d,move[i]为错误指针

i like linux...
2008-05-06 15:11
雨中飛燕
Rank: 1
等 级:新手上路
帖 子:765
专家分:0
注 册:2007-10-13
收藏
得分:0 
offsets move[8];           //各个方向的偏移表
这里根本没有手工初始化

offsets move[8]={{-1,0,"N"},{-1,1,"NE"},{0,1,"E"},{1,1,"SE"},
    {1,0,"S"},{1,-1,"SW"},{0,-1,"W"},{-1,-1,"NW"}};
main里面定义的只能在main里使用!!

[color=white]
2008-05-06 15:56
zjl138
Rank: 1
等 级:新手上路
威 望:1
帖 子:788
专家分:0
注 册:2007-11-12
收藏
得分:0 
晕,非常感谢飞燕姐,让你帮我找这样的错,真委屈你了,呵呵。
能成功运行了。我在下楼把代码贴上来。为感谢大家,我明天再写一个非递归解迷宫的程序上来,供大家参考。不要到时又错误多多就好了,呵呵。。。
谢谢!!!

i like linux...
2008-05-06 16:23
快速回复:迷宫问题?
数据加载中...
 
   



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

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