数据结构——迷宫求解

迷宫求解代码

#include<stdio.h>
#include<windows.h> //迷宫坐标位置类型
#define MAXSIZE 12  //迷宫的行数和列数最多为10 
struct Location{    //坐标  
    int x;
    int y;
}; 

struct Location begin; //起点
struct Location end;   //终点 
struct Location next; //下一个位置
struct Location dom[4]={{0,1},{1,0},{0,-1},{-1,0}}; //移动方向,依次为东南西北

typedef int Maze[MAXSIZE][MAXSIZE];
Maze m;

int row,col;//行和列数 


void Print(int row,int col)//定义墙元素值为0,可通过路径为-1,通过路径为足迹
{
    int i,j;
    for(i=0;i<=row+1;i++)
	{
        for(j=0;j<=col+1;j++)
            printf("%3d",m[i][j]);
        printf("\n");
    }
    printf("\n"); 
}


void Seek(struct Location now,int nowstep)//递归找下一点 
{
    int i;
    for(i=0;i<=3;i++) { //依次试探东南西北四个方向
        next.x=now.x+dom[i].x;
        next.y=now.y+dom[i].y; 
        if(m[next.x][next.y] == -1){
            m[next.x][next.y]=++nowstep;
            if(next.x != end.x || next.y != end.y)
                Seek(next,nowstep); // 试探下一点(递归调用)
            else
                Print(row,col);
            m[next.x][next.y]=-1; //恢复为通路,试探下一条路
            nowstep--;
        }
    }
}


int main()
{ 
    int i,j,num,x1,y1;
    printf("注:行数和列数不包含外墙\n "); 
    printf("请输入迷宫的行数和列数(不超过10): \n"); //外围墙不计入,自动生成 
    scanf("%d %d" ,&row,&col);
    for(i=0;i<=col+1;i++)
	{ 
        m[0][i]=0;  //上边墙
        m[row+1][i]=0;//下边墙
    }
    for(j=1;j<=row;j++)
	{
        m[j][0]=0;  //左边墙
        m[j][col+1]=0;//右边墙
   }
    for(i=1;i<=row;i++) //最初迷宫内没有墙 
	{
        for(j=1;j<=col;j++)
            m[i][j]=-1; //定义通道初值为-1
    } 
    printf("请输入迷宫内墙的个数: \n");
    scanf("%d", &num);
    if(num)
        printf("请输入迷宫内每个墙所在的位置(行和列): \n");
    for(i=1;i<=num;i++)
	{
        scanf("%d %d" ,&x1,&y1);
        m[x1][y1]=0;
    }
    printf("生成迷宫:\n");
    Print(row,col);
    printf("请输入起点的位置(行和列):\n ");
    scanf("%d%d",&begin.x,&begin.y); 
    printf("请输入终点的位置(行和列): \n");
    scanf("%d%d",&end.x,&end.y);
    m[begin.x][begin.y]=1; 
    Seek(begin,1); //由第一步起点试探起
    system("pause"); 
    return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值