| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 907 人关注过本帖
标题:【C语言探讨】-【迷宫求解-堆栈-回溯(含注释流程图)】
只看楼主 加入收藏
嘤鸣求友
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2012-4-14
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:2 
【C语言探讨】-【迷宫求解-堆栈-回溯(含注释流程图)】
这是我根据一本书上的描述自己写的代码和流程图,请高手多多指点~
迷宫-堆栈练习(含注释,流程图).rar (88.14 KB)


//此程序有错  欢迎讨论
//最后编辑:2012年4月14日
#include<stdio.h>
//#include"堆栈.cpp"
int rep[99];//记录当前位置数组
int i,j;//当前位置参数

#define MAX 100
int stack[MAX];//堆栈数组
int tos=0;        //记录栈顶位置
void walk(int);    //移动位置函数
    int maze[10][10]={
        {1,1,1,1,1,1,1,1,1,1},
        {1,0,0,0,0,0,1,0,1,1},
        {1,1,0,1,0,0,0,0,0,1},
        {1,0,0,1,1,1,0,1,1,1},
        {1,0,1,1,0,0,0,0,1,1},
        {1,0,1,0,1,1,1,1,0,1},
        {1,0,1,0,1,0,0,0,0,1},
        {1,0,1,0,0,0,1,1,1,1},
        {1,0,0,0,1,0,0,0,0,1},
        {1,1,1,1,1,1,1,1,1,1}
    };//迷宫二维数组
/****************************以下为堆栈函数************************************/
void push(int h)//压栈
{
    if(tos>=MAX)
    {
        printf("Stack overflow\n");
//        return 0;
    }
    stack[tos]=h;
    tos++;
}
int pop()//出栈
{
    tos--;
    if(tos<0)
    {
        printf("Stack underflow\n");
        return 0;
    }
    return stack[tos];
}
int empty()//是否为空
{
    if(tos<0)
        return 1;
    else
        return 0;
}

/****************************以上为堆栈函数************************************/

jilu(int a,int b)//记录当前位置函数,十位和个位分别表示 x轴,y轴 方位
{
    static n=0;
    rep[n]=a*10+b;
    n++;
}



void main()
{

    int now=11;
    walk(now);
    while(!empty())//输出存放的路径
    {
        i=pop();
        printf("%d",i);
    }

}

int report(int i,int j)//对比当前位置函数
{
    int k=0;
    int flag=1;
    while (rep[k]!='\0')
    {
        if(rep[k]==i*10+j)
        {
            flag=0;//即 搜索到此位置已走过
            break;
        }
        else k++;
    }
    return flag;
}


void walk(int now)//移动方位函数
{
    while(now!=88)
    {
        i=now/10;j=now%10;
        if(maze[i][j-1]!=1&&report(i,j-1))//向下方向 为0且没走过 则移动一次
        {
            jilu(i,j-1);//记录当前位置
            now=i*10+j-1;
            walk(now);
        }
        else if(maze[i+1][j]!=1&&report(i+1,j))
        {
            jilu(i+1,j);
            now=(i+1)*10+j;
            walk(now);
        }        
        else if(maze[i][j+1]!=1&&report(i,j+1))
        
            jilu(i,j+1);
            now=i*10+j+1;
            walk(now);
        }        
        else if(maze[i-1][j]!=1&&report(i-1,j))
        {
            jilu(i-1,j);
            now=(i-1)*10+j;
            walk(now);
        }
        else now=pop();//如果无路可走就 回溯 一次
    }
}
               
搜索更多相关主题的帖子: 记录 2012年 include 流程图 C语言 
2012-04-14 11:20
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
收藏
得分:20 
多多交流呵呵,最近玩了一下算法。
递归 回溯 贪心 ==
。。。。。。。。。。。。。。

用心做一件事情就这么简单
2012-04-14 13:42
嘤鸣求友
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2012-4-14
收藏
得分:0 
哇,没有人那,我第一个帖子……5555555555555
2012-04-16 14:56
快速回复:【C语言探讨】-【迷宫求解-堆栈-回溯(含注释流程图)】
数据加载中...
 
   



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

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