| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4184 人关注过本帖
标题:求迷宫的全代码
只看楼主 加入收藏
hunterevil
Rank: 1
等 级:新手上路
帖 子:17
专家分:3
注 册:2016-1-12
结帖率:66.67%
收藏
已结贴  问题点数:5 回复次数:4 
求迷宫的全代码
对于迷宫的东南西北的方向问题求具体讲解
2016-03-21 13:12
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:5 
上下左右呗

int a[][2] = {
    {0, -1}, {0, -1}, {-1, 0}, {1, 0}
}


[fly]存在即是合理[/fly]
2016-03-21 17:59
hunterevil
Rank: 1
等 级:新手上路
帖 子:17
专家分:3
注 册:2016-1-12
收藏
得分:0 
有迷宫的所有代码吗?
2016-03-21 19:56
浅浅520
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2016-10-14
收藏
得分:0 
#include <stdio.h>
 #include <stdlib.h>
 #define STACK_INIT_SIZE 10000
 #define STACKINCREMENT 110
 #define M 11
 #define N 10
 int flag=0;
 typedef struct//坐标位置
{
     int x;//行
     int y;//列
 }PosType;//坐标位置类型
 typedef struct//栈中元素结构体
{
     int ord;//通道块在路径上的“序号
    PosType seat;//通道块在迷宫里的“坐标位置”
    int di;//通道方向(1东2南3西4北)
 }SElemType;//栈的元素类型
 typedef struct//栈
{
     SElemType *base;
     SElemType *top;
     int stacksize;////当前已分配的存储空间,以元素为单位
 }SqStack;
//栈操作
void initialStack(SqStack *s)//栈的建立
{
     s->base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
     if(!s->base) exit(0);////存储分配失败
     s->top=s->base;
     s->stacksize=STACK_INIT_SIZE;
 }
 void Push(SqStack *s,SElemType e)//插入栈顶为e的元素
{
     if(s->top-s->base>=s->stacksize)
     {//栈满,追加存储空间
         s->base=(SElemType *)realloc(s->base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(SElemType));
         if(!s->base) exit(0);
         s->top=s->base+s->stacksize;
         s->stacksize+=STACKINCREMENT;
     }
     (*(s->top)).ord=e.ord;
     (*(s->top)).seat.x=e.seat.x;
     (*(s->top)).seat.y=e.seat.y;
     (*(s->top)).di=e.di;
     s->top++;
 }
 void Pop(SqStack *s,SElemType *e)//删除栈顶元素 用e返回
{
     if(s->top==s->base) exit(0);
     (s->top)--;
     e->ord=(*(s->top)).ord;
     e->seat.x=(*(s->top)).seat.x;
     e->seat.y=(*(s->top)).seat.y;
     e->di=(*(s->top)).di;
 }
 int StackEmpty(SqStack *s)//检查栈是否为空
{
     if(s->top==s->base) return(1);
     else return(0);
 }
 void ClearStack(SqStack *s)//将s栈清空
{
     s->top=s->base;
     s->stacksize=0;
 }
 //初始化迷宫

 void initmaze(int maze[M][N])
 {
    int i,j;
    int m,n; //迷宫行,列 [/M]
    printf("请输入迷宫的行数 m=");
    scanf("%d",&m);
    printf("请输入迷宫的列数 n=");
    scanf("%d",&n);
    printf("\n请输入迷宫的各行各列:\n用空格隔开,0代表路,1代表墙\n",m,n);
    for(i=1;i<=m;i++)
      for(j=1;j<=n;j++)
         scanf("%d",&maze[i][j]);
    printf("你建立的迷宫为(最外圈为墙)...\n");
    for(i=0;i<=m+1;i++) //加一圈围墙
    {
      maze[i][0]=8;
      maze[i][n+1]=8;
    }
    for(j=0;j<=n+1;j++)
    {
      maze[0][j]=8;
      maze[m+1][j]=8;
    }
    for(i=0;i<=m+1;i++) //输出迷宫
    {
       for(j=0;j<=n+1;j++)
       printf("%d ",maze[i][j]);
       printf("\n");
    }
 }


 void NextPos(PosType *p,int d)//确定下一个位置的坐标
{
     switch(d)
     {
     case 1:p->y++;break;//右东
     case 2:p->x++;break;//下南
     case 3:p->y--;break;//左西
     case 4:p->x--;break;//上北
     }   
}
void MazePath(int (*maze)[N])
 {   
     int curstep;
     int x,y;
     int mark[M][N]={0};
     SqStack s;
     PosType curpos;
     SElemType e;//栈中元素结构体 1.序号;2.坐标位置;3.通道方向
     initialStack(&s);
     printf("请输入入口坐标x,y:");
     scanf("%d%d",&curpos.x,&curpos.y); //设定入口
     curstep=1;//探索第一步
     do
     {
         if((!maze[curpos.x][curpos.y])&&(!mark[curpos.x][curpos.y]))
         {
             mark[curpos.x][curpos.y]=1;
             e.ord=curstep;
             e.seat.x=curpos.x;
             e.seat.y=curpos.y;
             e.di=1;
             Push(&s,e);
             if((curpos.x==M-2)&&(curpos.y==N-2))
             {
                 
                 flag=1;
                 printf("走出迷宫的一条坐标路径为:\n[终点]");
                 while(!StackEmpty(&s))
                 {
                     Pop(&s,&e);
                     printf("<--(%d,%d)",e.seat.x,e.seat.y);
                 }
                 printf("<--[起点]");
                 printf("\n");
                 ClearStack(&s);
             }
                 NextPos(&curpos,1);//下一个位置是当前位置的东邻
                 curstep++;//探索下一步
         }
             else
             {
                 if(!StackEmpty(&s))
                     Pop(&s,&e);//留下不能通过的标记
                 while(e.di==4&&!StackEmpty(&s))//栈不空但是栈顶位置四周均不通
                 {
                     mark[e.seat.x][e.seat.y]=1;
                     Pop(&s,&e);
                 }
                 if(e.di<4)
                 {
                     e.di++;
                     Push(&s,e);;//换下一个方向探索
                     curpos.x=e.seat.x;
                     curpos.y=e.seat.y;
                     NextPos(&curpos,e.di);//设定当前位置是该新方向上的相邻块
                 }
             }
     }while(!StackEmpty(&s));
 }
 void main()
 {
     int maze[M][N];
      PosType curpos;
    initmaze(maze[M][N]);
     MazePath(maze);
     printf("输入入口的横坐标,纵坐标[逗号隔开]\n");
     scanf("%d,%d",&curpos.x,&curpos.y);
     printf("输入出口的横坐标,纵坐标逗号隔开]\n");
     scanf("%d,%d",&curpos.x,&curpos.y);

     if(flag==0)
         printf("该迷宫不能走出去!\n");
 }
我编译没错,但是不知道组建哪里错了
2016-11-17 20:43
浅浅520
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2016-10-14
收藏
得分:0 


[此贴子已经被作者于2016-11-17 21:03编辑过]

2016-11-17 20:43
快速回复:求迷宫的全代码
数据加载中...
 
   



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

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