| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1341 人关注过本帖
标题:迷宫课设 100%原创 C描述
只看楼主 加入收藏
杨亚勤
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2010-1-29
结帖率:0
收藏
 问题点数:0 回复次数:8 
迷宫课设 100%原创 C描述

 typedef     struct   StackNode
{
    ElemType    data;
    StackNode   *next;
)StackNode, *LinkType;                      //结点类型,指针类型



typedef    struct
{
    LinkType    top;
    int    size;
}Stack;                                     //栈类型





//栈的基本操作如下

Status   InitStack(Stack  &s)
{
    s.top=NULL;
    s.size=0;
    return ok;
}





Status     Push(Stack  &s,ElemType  e)
{
    p=(LinkType*)malloc( sizeof(StackNode) );
    if(!p)      return FALSE;
    p.data=e;
    p.next=s.top;
    s.top=p;
    s.size++;
    return TURE;
}







Status      StackEmpty(Stack &s)
{
    if(s.top==NULL)     return TURE;
    else    return FALSE;
}










Status    GetTop(Stack &s,ElemType e)
{
    if( s.top==NULL )   return  ERROR;
    e=s.top->data;
    return  OK;
}








Status    Pop(Stack  &s)
{
    if( s.top==NULL )   return  ERROR;
    p=s.top;
    s.top=p->next;
    s.size--;
    free(p);
    return  OK;
}






Status   DestroyStack(Stack &s)
{
    free(s);
    return Ok;
}

//栈的基本操作如上







//迷宫类型

typedef    struct
{

    int   x,y;                           //表示点的方位
    int   Live;                         //Live=1,该点可走,Live=0,该点不可走,Live=2表示该点是解
    int   direction=10;                 //direction 表示当前点探索的方向,direction 初始10表示该点未探索任何方向
    int   count=1;                      //count表示当前点探索方向次数

}MazeType    maze[M*N];


//迷宫基本操作如下

status    InitMaze(MazeType &maze)                             //初始化迷宫,为方便操作,迷宫外设了一圈围墙
{
    for(j=0;j<=N-1;j++)
    {
        maze[j].Live=0;
        maze[j].x=j;
        maze[j].y=0;
        maze[ (M-1)*N+j ].Live=0;
        maze[ (M-1)*N+j ].x=j;
        maze[ (M-1)*N+j ].y=M-1;
    }
    for(i=1;i<=M-2;i++)
    {
        maze[i*N].Live=0;
        maze[i*N].x=0;
        maze[i*N].y=i;
        maze[ i*N+N-1 ].Live=0;
        maze[ i*N+N-1 ].x=N-1;
        maze[ i*N+N-1 ].y=i;
    )                                                                //初始化围墙部分
    printf("Input Maze:0 stand for unclear,1 stand for clear\n");
    for(i=1;i<=M-2;i++)
        for(j=1;j<=N-2;j++)
        {
            maze[ N*i+j ].x=j;
            maze[ N*i+j ].y=i;
            scanf( maze[ N*i+j ].Live );                               //用户输入迷宫部分
        }
    if(maze[N+1].Live==0)
    {
        maze[N+1].Live=1;
        printf("Sorry,(1,1)must be initialized alive");
    }
    return ok;
}







Status   MazeSolve(MazeType &maze)                             //求解M*N的迷宫
{
    k=2;
    InitStack(s);
    Push(s,N+1);
    while( !StackEmpty(s) )
    {
        GetTop(s,cur);
        while( maze[cur].count<=3)
        {
            if(cur==Arrival)   {   Answer(maze,s);     return ok;  }              //Arrival 目的地编号
            if( maze[cur].direction!=10 )      k=maze[cur].direction;
            m=MD[k].next;
            maze[cur].direction=m;
            next_number=Number( maze[cur].x, maze[cur].y, m);
            maze[cur].count++;
            if( maze[next_number].Live==1 )
            {
                Gone=m;
                Push(s,next_number);
                break;
            }
        }
        if( maze[cur].count==4 )      Pop(s);
        else    k=Transform(Gone);
    }
    printf("No Path");
    DestroyStack(s);
    return  ERROR;
}



Status  Answer( MazeType &maze,Stack s )                        // 确定最终路径,更新Live值
{
    while( !StackEmpty(s) )
    {
         Pop(s,e);
         maze[e].Live=2;
    }
    DestroyStack(s);
    return ok;
}





Status   Print( MazeType &maze )                             //打印结果
{
    count=0;
    k=1;
    while(count<=M*N-1)
    {
        switch( maze[count].Live )
        {                                                     //0代表不通,1代表通,*代表路径
            case 0: printf("0");
            case 1: printf("1");
            case 2: printf("*");
        }
        if( k%N==0 )   printf("\n");
        k++;
    }
    return OK;
}

//迷宫基本操作如上









//方向类型

typedef    struct
{

    int    next;

}MoveDirection    MD[4];




//方向的基本操作如下

Status    InitMoveDirection(&MD)               //North=0,South=1,West=2,East=3
{
    for(k=0;k<=2;k++)
    {
        MD[k].next=k+1;
    }
    MD[3].next=0;
    return ok;
}





int    Transform(int Gone)                      //Gone表示来的方向
{                                               //函数的功能是返回与Gone相反的方向
    if( Gone%2==0 )   return  Gone+1;
    else    return  Gone-1;
}

//方向的基本操作如上










int    Number(int x,int y,int direction)              //根据移动方向和当前点位置确定下个点编号
{
    switch (direction)
    {
        case  0:    return  N*(y-1)+x;
        case  1:    return  N*(y+1)+x;
        case  2:    return  N*y+x-1;
        case  3:    return  N*y+x+1;
    }
}










#define M=10;
#define N=10;
int    main()
{
      MazeType   maze[M*N];
      InitMaze(maze);
      printf("Maze Below:");
      Print(maze);
      MazeSolve(maze);
      printf("Maze Sovled Below:");
      Print(maze);
      return 0;
}
搜索更多相关主题的帖子: 描述 迷宫 
2010-02-05 22:05
showboat2009
Rank: 2
等 级:论坛游民
帖 子:16
专家分:19
注 册:2010-3-11
收藏
得分:0 
   好复杂!
2010-03-28 18:46
编程小呆
Rank: 2
来 自:西电
等 级:论坛游民
帖 子:31
专家分:23
注 册:2010-3-20
收藏
得分:0 
收藏测试下
2010-03-30 19:27
asdjc
Rank: 6Rank: 6
来 自:武汉
等 级:侠之大者
威 望:7
帖 子:98
专家分:487
注 册:2010-1-22
收藏
得分:0 
是真的原创的话,写出流程图,及一些算法描述,我帮你将帖子置顶。
2010-04-02 20:51
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

#define LEN sizeof(struct LNode)
#define INIT_SIZE 100
#define INCREMENT 10
#define N  10

int i = 0;//方向探索的次数
char p[N][N] = {
    {'#','#','#','#','#','#','#','#','#','#'},
    {'#',' ',' ','#',' ',' ',' ','#',' ','#'},
    {'#',' ',' ','#',' ',' ',' ','#',' ','#'},
    {'#',' ',' ',' ',' ','#','#',' ',' ','#'},
    {'#',' ','#','#','#',' ',' ',' ',' ','#'},
    {'#',' ',' ',' ','#',' ',' ',' ',' ','#'},
    {'#',' ','#',' ',' ',' ','#',' ',' ','#'},
    {'#',' ','#','#','#',' ','#','#',' ','#'},
    {'#','#',' ',' ',' ',' ',' ',' ',' ','#'},
    {'#','#','#','#','#','#','#','#','#','#'}
};

typedef struct LNode
{
    int y;
    int x;
    int flag; //1表示东,2表示南,-1表示西,-2表示北
}LNode;

typedef struct
{
    LNode *base;
    LNode *top;
    int stacksize;
}sqstack;


//初始化栈
void Init( sqstack &s )
{
    s.base = (LNode *) malloc (INIT_SIZE * LEN);
    if( !s.base )
        exit(0);
    s.top = s.base;
    s.stacksize = INIT_SIZE;
}

void Push( sqstack &s, LNode e )
{
    if( s.top - s.base >= s.stacksize )
    {
        s.base = (LNode *) realloc (s.base, (s.stacksize+INCREMENT)*LEN);
        if( !s.base )
            exit(0);
        s.top = s.base + s.stacksize;
        s.stacksize += INCREMENT;
    }
    *s.top++ = e;
}

void Pop( sqstack &s, LNode &e )
{
    if( s.top == s.base )
        exit(0);
    e = *--s.top;
}
//获取栈顶
LNode Getop( sqstack s )
{
    if( s.top == s.base )
        exit(0);
    return *(s.top-1);
}
//输出有效路径
void Output( sqstack s )
{
    printf("经过的路径为:\n");
    LNode e;
    sqstack m;
    Init( m );
    while( s.base != s.top )
    {
        Pop( s, e );
        Push( m, e);
    }
    while( m.base != m.top )
    {
        Pop( m, e );
        printf("(%d, %d) ", e.x, e.y );
    }
    printf("\n");
}
//倒退
void Goback( sqstack &s )
{
    LNode e;
    if( i == 4 )
    {
        if( Getop(s).flag == 1 )
        {
            Pop( s, e );
            //p[e.x][e.y-1] = ' ';
            p[e.x][e.y] = '#';
        }
        else if( Getop(s).flag == 2 )
        {
            Pop( s, e );
            //p[e.x+1][e.y] = ' ';
            p[e.x][e.y] = '#';
        }
        else if( Getop(s).flag == -1 )
        {
            Pop( s, e );
            //p[e.x][e.y+1] = ' ';
            p[e.x][e.y] = '#';
        }
        else if( Getop(s).flag == -2 )
        {
            Pop( s, e );
            //p[e.x-1][e.y] = ' ';
            p[e.x][e.y] = '#';
        }
        i = 0;
    }

}

void Move()
{
    printf("原图:\n");
    for(int j=0;j<N;j++)
    {
    for(int k=0;k<N;k++)
            printf("%c",p[j][k]);
        printf("\n");
    }   
    printf("\n");
    sqstack player;
    LNode e, temp;
    //初始化条件 起点和方向
    e.x = 1;
    e.y = 1;
    e.flag = 1;

    Init( player );
    Push( player, e );
    temp = Getop( player );

    while( (temp.x != 8) || (temp.y != 8) )
    {
        if( temp.flag == 1 )
        {
            ++i;
            if( p[e.x][e.y+1] != '#' )//向东探索
            {
                p[e.x][e.y] = '#';
                e.y += 1;
                Push( player, e );
                i = 0;
            }
            else
            {
                Pop( player, e );
                e.flag = 2;
                Push( player, e );
                Goback( player );
            }
        }
        if( temp.flag == 2 )
        {
            ++i;
            if( p[e.x+1][e.y] != '#' )//向南探索
            {
                p[e.x][e.y] = '#';
                e.x += 1;
                Push( player, e );
                i = 0;
            }
            else
            {
                Pop( player, e );
                e.flag = -1;
                Push( player, e );
                Goback( player );
            }
        }
        if( temp.flag == -1 )
        {
            ++i;
            if( p[e.x][e.y-1] != '#' )//向西探索
            {
                p[e.x][e.y] = '#';
                e.y -= 1;
                Push( player, e );
                i = 0;
            }
            else
            {
                Pop( player, e );
                e.flag = -2;
                Push( player, e );
                Goback( player );
            }
        }
        if( temp.flag == -2 )
        {
            ++i;
            if( p[e.x-1][e.y] != '#' )//向北探索
            {
                p[e.x][e.y] = '#';
                e.x -= 1;
                Push( player, e );
                i = 0;
            }
            else
            {
                Pop( player, e );
                e.flag = 1;
                Push( player, e );
                Goback( player );
            }
        }        
        temp = Getop( player );
    }
    printf("路过的足迹:\n");
    for(j=0;j<N;j++)
    {
        for(int k=0;k<N;k++)
            printf("%c",p[j][k]);
        printf("\n");
    }   
    printf("\n");
    Output( player );//(8,8)点没有足迹
}

int main()
{
    Move();

    return 0;
}
2010-04-03 13:55
asdjc
Rank: 6Rank: 6
来 自:武汉
等 级:侠之大者
威 望:7
帖 子:98
专家分:487
注 册:2010-1-22
收藏
得分:0 
像这样的代码网上多的是,要写出流程图和注释才能显示实力。
2010-04-03 19:50
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 

LS 说的是   
给别人看的程序 注释很关键 不然 无从看起
2010-04-04 12:47
andydong
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2010-5-9
收藏
得分:0 
看看
2010-05-09 22:32
李秋雨
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2014-12-22
收藏
得分:0 
运行怎么出错了啊?
2014-12-22 21:04
快速回复:迷宫课设 100%原创 C描述
数据加载中...
 
   



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

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