电子老鼠闯迷宫(广搜_队列)_机器寻径引导(最短路径表)

本文介绍了一种基于广度优先搜索的迷宫寻路算法,通过队列实现对迷宫地图的有效遍历,并求出从起点到终点的最短步数。

时限:1000ms 内存限制:10000K  总时限:3000ms

描述:

有一只电子老鼠被困在如下图所示的迷宫中。这是一个12*12单元的正方形迷宫,黑色部分表示建筑物,白色部分是路。 电子老鼠可以在路上向上、下、左、右行走,每一步走一个格子。现给定一个起点S和一个终点T,求出电子老鼠最少 要几步从起点走到终点。

输入:

本题包含一个测例。在测例的第一行有四个由空格分隔的整数,分别表示起点的坐标S(x.y)和终点的坐标T(x,y)。 从第二行开始的12行中,每行有12个字符,描述迷宫的情况,其中'X'表示建筑物,'.'表示路.

输出:

输出一个整数,即电子老鼠走出迷宫至少需要的步数。

输入样例:

2 9 11 8
XXXXXXXXXXXX
X......X.XXX
X.X.XX.....X
X.X.XX.XXX.X
X.X.....X..X
X.XXXXXXXX.X
X...X.X....X
X.XXX...XXXX
X.....X....X
XXX.XXXX.X.X
XXXXXXX..XXX
XXXXXXXXXXXX

输出样例:

28

 

#include<stdio.h>
void readdata();
void init();
int  search();
bool empty_queue();
void addto_queue(int row,int col);
int  takeout_queue();
bool canmoveto(int row,int col,int *r,int *c,int i);
bool isaim(int row,int col);

#define N 12
char Array[12][12];
int beginrow,begincol,endrow,endcol;
int head,tail,queue[1000],queue_len=1000;//广搜,使用队列
int main()
{
    int i,j;
    int step_num;
    readdata();
    init();
    //////输出初始状态
    printf("初始状态:\n");
    for(i=0;i<N;i++)
    {  
        for(j=0;j<N;j++)
        {
            printf("%2c",Array[i][j]);       
        }
        printf("\n");
    }
    //////
    step_num=search();
    printf("结束状态:\n");
    for(i=0;i<N;i++)//输出搜索之后的状态
    {  
        for(j=0;j<N;j++)
        {
            if(Array[i][j]=='*' ||Array[i][j]=='.')
                printf("%3c",Array[i][j]);//char[][]既可用%c输出(字符)    
            else
                printf("%3d",Array[i][j]-48);//也可用%d输出(数字)
        }
        printf("\n");
    }
    printf("%d\n",step_num);
    return 0;
}

//////////////////////////////////////////////
int search()
{
    int i;
    int u,row,col,r,c;
    int num;
    while(!empty_queue())
    {
         u=takeout_queue();
         row=u/N;  col=u%N;
         num=Array[row][col]-48;//字符到数字(路径长)
         for(i=0;i<4;i++)//四个方向,广搜
         {
             if(canmoveto(row,col,&r,&c,i))
             {
                 if(isaim(r,c))
                    return num+1;//返回最短路径长度
                 Array[r][c]=(num+48)+1;//(路径长)数字到字符(Array[][]是字符数组)
                 addto_queue(r,c);
             }
         }
    }
    return 0;
}
bool empty_queue()
{
    if(head==tail)
        return true; 
    return false;
}
int takeout_queue()
{
   int u;
   u=queue[head++];
   head=head%queue_len;
   return u;
}
bool canmoveto(int row,int col,int *r,int *c,int i)//判断能否由当前位置有方向i移动到下一位置
{
    int PresentRow=row;
    int PresentCol=col;
    switch(i)
    {
        case 0: col--; break;//
        case 1: row++; break;//
        case 2: col++; break;//
        case 3: row--; break;//
    }
    *r=row;
    *c=col;
    if(row>=0 &&col>=0 &&row<N &&col<N)
        if(Array[row][col]=='.' ||Array[*r][*c]>Array[PresentRow][PresentCol]+1)//该点未走过,或有更短路径过该点
            return true;
    return false;
}
bool isaim(int r,int c)
{
    if(r==endrow-1 &&c==endcol-1)
        return true;
    return false;
}
void addto_queue(int row,int col)
{
    int u;
    u=row*N+col;
    queue[tail++]=u;
    tail=tail%queue_len;
}


//////////////////////////////////////////////
void readdata()
{
    int i,j;
    char str[12];
        scanf("%d%d",&beginrow,&begincol);//起点坐标
        scanf("%d%d",&endrow,&endcol);//终点点坐标    
    for(i=0;i<N;i++)
    {
        scanf("%s",str);//迷宫布局
        //gets(str);
        for(j=0;j<N;j++)
        {
           if(str[j]=='.')
               Array[i][j]='.';
           else 
               Array[i][j]='*';
        }
    }
}
void init()
{
   head=0;
   tail=1;
   queue[0]=beginrow*N +begincol;//队列初始情况(queue中元素值在区间0~11*12+11之间)
   Array[beginrow][begincol]=0+48;//初始位置置'0'
}

/*
2 9 11 8
XXXXXXXXXXXX
X......X.XXX
X.X.XX.....X
X.X.XX.XXX.X
X.X.....X..X
X.XXXXXXXX.X
X...X.X....X
X.XXX...XXXX
X.....X....X
XXX.XXXX.X.X
XXXXXXX..XXX
XXXXXXXXXXXX
初始状态:
 * * * * * * * * * * * *
 * . . . . . . * . * * *
 * . * . * * . . . 0 . *
 * . * . * * . * * * . *
 * . * . . . . . * . . *
 * . * * * * * * * * . *
 * . . . * . * . . . . *
 * . * * * . . . * * * *
 * . . . . . * . . . . *
 * * * . * * * * . * . *
 * * * * * * * . . * * *
 * * * * * * * * * * * *
结束状态:
  *  *  *  *  *  *  *  *  *  *  *  *
  *  9  8  7  6  5  4  *  2  *  *  *
  * 10  *  8  *  *  3  2  1  0  1  *
  * 11  *  9  *  *  4  *  *  *  2  *
  * 12  *  8  7  6  5  6  *  4  3  *
  * 13  *  *  *  *  *  *  *  *  4  *
  * 14  .  .  * 12  *  8  7  6  5  *
  *  .  *  *  * 11 10  9  *  *  *  *
  *  .  . 14 13 12  * 10 11 12 13  *
  *  *  *  .  *  *  *  * 12  *  .  *
  *  *  *  *  *  *  *  . 13  *  *  *
  *  *  *  *  *  *  *  *  *  *  *  *
14
Press any key to continue
*/

 

 

 

转载于:https://www.cnblogs.com/IThaitian/archive/2012/07/08/2581759.html

AI-PPT 一键生成 PPT:用户输入主题关键词,AI-PPT 可快速生成完整 PPT,涵盖标题、正文、段落结构等,还支持对话式生成,用户可在 AI 交互窗口边查看边修改。 文档导入转 PPT:支持导入 Word、Excel、PDF 等多种格式文档,自动解析文档结构,将其转换为结构清晰、排版规范的 PPT,有保持原文和智能优化两种模式。 AI-PPT 对话 实时问答:用户上传 PPT 或 PPTX 文件后,可针对演示内容进行提问,AI 实时提供解答,帮助用户快速理解内容。 多角度内容分析:对 PPT 内容进行多角度分析,提供全面视野,帮助用户更好地把握内容结构和重点。 多语言对话支持:支持多语言对话,打破语言障碍,方便不同语言背景的用户使用。 AI - 绘图 文生图:用户输入文字描述,即可生成符合语义的不同风格图像,如油画、水彩、中国画等,支持中英文双语输入。 图生图:用户上传图片并输入描述,AI - 绘图能够根据参考图和描述生成新的风格化图像,适用于需要特定风格或元素的创作需求。 图像编辑:提供如 AI 超清、AI 扩图、AI 无痕消除等功能,用户可以上传图片进行细节修改和优化,提升图片质量。 AI - 文稿 文案生成:能够根据用户需求生成多种类型的文章,如市场营销文案、技术文档、内部沟通内容等,提升文案质量和创作效率。 文章润色:对已有文章进行改善和优化,包括语言达、逻辑连贯性、内容流畅度等方面,使文章更符合用户期望和风格。 文章续写:AI 技术理解文本语境,为用户提供新的想法、补充资料或更深层次的见解,帮助用户丰富文档内容。 AI - 医生 智能健康咨询:包括症状自查,用户输入不适症状,AI 结合病史等信息提供疾病可能性分析与初步建议;用药指导,支持查询药品适应症、禁忌症等,并预警潜在冲突;中医辨证,提供体质辨识与调理建议。 医学报告解读:用户上传体检报告
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值