迷宫问题并且输出最短路径

#include<stdio.h>
#include<stdlib.h>
/*
5 6
0 1 0 0 0 1
0 0 0 1 0 0
1 0 1 0 0 1
1 0 0 1 0 1
1 1 0 0 0 0
1 1 4 5
*/
int book[50][50],a[50][50],m,n;
int mi[1000],ni[1000];
int p,q,min=99999999; //p,q分别表示终点的横纵坐标
int sum=1;
void dfs(int x,int y,int step,int M)
{
    //定义方向,分别表示右下左上
    int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
    int tx,ty,k;
    if(x==p&&y==q)  //到达终点
    {
        if(step<min){
            min=step;  //更新步数
            for(int i=0;i<2*min;i++){
                ni[i]=mi[i];
            }
        }
            
        printf("第%d种方法为 ",sum++);
        for(int i=0;i<2*step;i+=2){
        printf("(%d,%d) ",mi[i],mi[i+1]);
    }
        printf("\n");
        return ;
    }
    //枚举四种走法
    for(k=0;k<=3;k++)
    {
        //计算下一个点的坐标
        tx=x+next[k][0];
        ty=y+next[k][1];
        //检查是否越界
        if(tx<1||tx>m||ty<1||ty>n)
            continue;
        //判断该点是否是障碍物或者是否在路径中
        if(book[tx][ty]==0&&a[tx][ty]==0)  //如果不在路中并且不是障碍物
        {   mi[M]=tx,mi[M+1]=ty;
            book[tx][ty]=1;
            dfs(tx,ty,step+1,M+2);
            book[tx][ty]=0;
        }
    }
    return ;
}

int main()
{
    int start_x,start_y;
    scanf("%d%d",&m,&n);
    //构造迷宫
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=n;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    //输入起点和终点
    scanf("%d%d%d%d",&start_x,&start_y,&p,&q);
    //从起点开始搜索
    book[start_x][start_y]=1;  //标识起点在路径中防止后面重走
    //调用函数
    dfs(start_x,start_y,0,0);  //起始的x,y点以及初始的步数
    //打印最短步数
    printf("%d\n",min);
    for(int i=0;i<2*min;i+=2)
        printf("(%d,%d) ",ni[i],ni[i+1]);
    return 0;
}

 

posted @ 2018-10-17 20:48  syl12138  阅读(304)  评论(0编辑  收藏  举报