迷宫编程

      读书的时候总听说什么迷宫问题(c版本),当时只是云里雾里。听大家说队列能够解决问题。就也跟着说队列能够解决问题。现在实施起来,还是有点麻烦的。参考了清华大学c习题与解析中的一程序:

 

#include  < stdio.h >
#define  M 5
#define  N 5

struct  stype            /* 队列用来存储所访问过的点 */
{
    
int x, y, pre;
}
sq[ 49 ];

void  printmglj( int  rear);     /* 函数声明 */

int  mg[M + 2 ][M + 2 =                  /* 初始化迷宫图形 */
    
{
        
{1,1,1,1,1,1,1},
        
{1,0,0,1,1,1,1},
        
{1,1,0,0,1,0,1},
        
{1,0,1,0,0,0,1},
        
{1,0,1,1,0,1,1},
        
{1,1,1,1,0,0,1},
        
{1,1,1,1,1,1,1},
    }
;
int  zx[ 4 ],zy[ 4 ];

void  init()             /* 打印出迷宫图形 */
{
    
int i, j;
    
int k = 0;
    
for(i = 0; i <= M+1; i++)
        
for(j = 0; j <= M+1; j++)
        
{
            k
++;
            printf(
"%3d",mg[i][j]);
            
if(k%7 == 0)
            printf(
" ");
        }

    zx[
0= -1; zx[1= 0; zx[2= 1; zx[3= 0;  /* 设立方向(不包括斜四角)*/

    zy[
0= 0; zy[1= 1; zy[2= 0; zy[3= -1;

}


void  printmglj( int  rear)        /* 输出迷宫路径 */
{
    
int i;
    i 
= rear;
    
do
    
{
        printf(
"(%d,%d) ",sq[i].x,sq[i].y);
        i 
= sq[i].pre;
    }
while(i != 0);
}


void  mglj()
{
    
int i, j;  /*结点坐标*/
    
int x, y;  /*存储的结点坐标*/
    
int v;     /*移动方向*/
    
int front, rear;  /*存储队列*/
    
int find;  /*是否找到出路*/

    sq[
1].x = 1;
    sq[
1].y = 1;
    sq[
1].pre =  0;
    find 
= 0;
    front 
= 1; rear = 1; mg[1][1= -1;

    
while((front <= rear) && (!find))
    
{
        x 
= sq[front].x;
        y 
= sq[front].y;
        
for(v = 0; v <4; v++)
        
{
            i 
= x+zx[v];
            j 
= y+zy[v];
            
if(mg[i][j] == 0)
            
{
                rear
++;
                sq[rear].x 
= i;
                sq[rear].y 
= j;
                sq[rear].pre 
= front;
                mg[i][j] 
= -1;
            }

            
if(i == M && j == N)     /* 能够正常走出 */
            
{
                printmglj(rear);
                find 
= 1;
            }

        }

        front
++;
    }

     
if(!find)
        printf(
"不存在路径! ");
}


void  main()
{
    init();
    mglj();
    getch();
}

 经过WIN-TC测试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值