首页
社区
课程
招聘
[旧帖] [分享] 迷宫 代码 0.00雪花
发表于: 2010-12-12 21:08 1215

[旧帖] [分享] 迷宫 代码 0.00雪花

2010-12-12 21:08
1215
#include<stdio.h>

#include<iostream>
#include<stdlib.h>
#include<time.h>
#define STACK_INIT_SIZE 1000
#define STACKINCREMENT 10
#define OK 1
#define OVERFLOW 0
#define ERROR 0

//typedef int SElemType;
typedef struct SElemType{
        int x;int y;
};
typedef struct{
        SElemType *base;
        SElemType *top;
        int stacksize;
}SqStack;
int InitStack(SqStack &S){
        S.base=(SElemType *)malloc(STACK_INIT_SIZE *sizeof(SElemType));
        if(!S.base) exit(OVERFLOW);
        S.top=S.base;
        S.stacksize=STACK_INIT_SIZE;
        return OK;
}
void Push(SqStack &S,SElemType &e){
        if(S.top-S.base>=S.stacksize){
                S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
                if(!S.base) exit (OVERFLOW);
                S.top=S.base+S.stacksize;
                S.stacksize+=STACKINCREMENT;
        }
        *S.top++=e;
}
SElemType Pop(SqStack &S,SElemType &e){
        //if(S.top==S.base) return ERROR;
        e=*--S.top;
        return e;
}
SElemType GetTop(SqStack S,SElemType &e){
        e=*(S.top-1);
        return e;
}

int StackEmpty(SqStack &S)
{//若栈S为空栈,则返回OK,否则返回ERROR
        if(S.base==S.top)
                return OK;
        else
                return ERROR;
}

int main()
{
        int m;
        SqStack S;
        InitStack(S);
        printf("请输入迷宫的大小(m*m)");
        scanf("%d",&m);
        //数组的形式表示八个方向
        int move[8][2]={{0,1},{1,1},{1,0},
                                        {1,-1},{0,-1},{-1,-1},{-1, 0},{-1, 1}};
       
        //用结构体表示位置
        struct position
        {
                int x,y;
        };
        //用于记录和输出迷宫探路中相关符号,包括1 .
        char maze[20][20];
        //用栈来存储探路过程中的数据
        int i,x,y,ok;
    SElemType p;
        //二维数组的第0行、第m+1行、第0列、第m+1列元素全
        //置成“1”,表示迷宫的边界;第1行第1列元素和第m行第m列
        //元素置成“0”,表示迷宫的入口和出口;其余元素值用随机
        //函数产生。
        srand(time(0));
        for(x=1;x<=m;x++)
                for(y=1;y<=m;y++)
                        maze[x][y]=48+rand()%2;
        maze[1][1]='0';maze[m][m]='0';
        for(x=0;x<=m+1;x++)
        {
                maze[x][0]='1';maze[x][m+1]='1';
        }
        for(y=0;y<=m+1;y++)
        {
                maze[0][y]='1';maze[m+1][y]='1';
        }
        p.x=1;p.y=1;
        Push(S,p);
        maze[1][1]='.';
        printf("迷宫初始为(m*m)\n");
        for(x=1;x<=m;x++)
        {
                printf("\n");
                for(y=1;y<=m;y++)
                        printf("%c ",maze[x][y]);
                       
        }
        printf("\n");
       
        //开始探路
        do{
                GetTop(S,p);
                ok=0;i=0;
                while((ok==0)&&(i<8))
                {
                        x=p.x+move[i][0];
                        y=p.y+move[i][1];
                        if(maze[x][y]=='0')
                        {
                                p.x=x;p.y=y;
                                Push(S,p);
                                maze[x][y]='.';
                                ok=1;
                        }
                        i++;
                }
                if(i==8)
                {
                        maze[p.x][p.y]='*';
                        Pop(S,p);
                }
        }while((!StackEmpty(S))&&((p.x!=m)||(p.y!=m)));
        //输出探路结果
        if(StackEmpty(S)) printf("没有路径\n");
        else printf("有路径\n");
        //输出探路迷宫留下的踪迹
        for(x=1;x<=m;x++)
        {
                printf("\n");
                for(y=1;y<=m;y++)
                        printf("%c ",maze[x][y]);
                       
        }
        printf("\n");
    system("pause");

}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 225
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
谢谢分享
代码好难学啊
2010-12-12 21:15
0
雪    币: 26
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
Thanks for sharing.
2010-12-12 21:18
0
雪    币: 678
活跃值: (101)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
4
说说思路再加上代码这样更加好。
2010-12-12 21:58
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢楼主分享
2010-12-12 22:01
0
游客
登录 | 注册 方可回帖
返回
//