zoukankan      html  css  js  c++  java
  • 7084:迷宫问题

    题目链接:http://noi.openjudge.cn/ch0205/7084/

    总时间限制: 1000ms 内存限制: 65536kB
    描述

    定义一个二维数组: 

    int maze[5][5] = {
    0, 1, 0, 0, 0,
    0, 1, 0, 1, 0,
    0, 0, 0, 0, 0,
    0, 1, 1, 1, 0,
    0, 0, 0, 1, 0,
    };

    它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。 

    输入
    一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
    输出
    左上角到右下角的最短路径,格式如样例所示。
    样例输入
    0 1 0 0 0
    0 1 0 1 0
    0 0 0 0 0
    0 1 1 1 0
    0 0 0 1 0
    样例输出
    (0, 0)
    (1, 0)
    (2, 0)
    (2, 1)
    (2, 2)
    (2, 3)
    (2, 4)
    (3, 4)
    (4, 4)

    算法分析:广搜。

      1 #include<stdio.h>
      2 #include<iostream>
      3 #include<queue>
      4 using namespace std;
      5 struct obj
      6 {
      7     int xx,yy,index;//index记录(xx,yy)这个点在a[]和pre[]中的下标 
      8 };
      9 
     10 int n,m;
     11 int map[102][102];
     12 queue<struct obj> q;
     13 struct obj S,T;
     14 
     15 struct obj a[102*102+3];
     16 int pre[102*102+3];//pre[i]记录a[i]这个点在广搜中的前驱结点 
     17 int index;//a[]和pre[]的下标 
     18 
     19 int dx[4]={-1,0,1,0};//上右下左 
     20 int dy[4]={0,1,0,-1};
     21 void BFS();
     22 
     23 int main(int argc, char *argv[])
     24 {
     25     struct obj tt[102*102+3];//用于正向输出路径
     26      
     27     freopen("7084.in","r",stdin);
     28     int i,j;
     29     n=m=5;
     30     for(i=0;i<n;i++)
     31     {
     32         for(j=0;j<m;j++)
     33         {
     34             scanf("%d",&map[i][j]);
     35         }
     36     }
     37     S.xx=0;   S.yy=0;    S.index=0;//出发点在广搜过程中,放在a[]第0号位置 
     38     T.xx=n-1; T.yy=m-1;  T.index=-1; 
     39     
     40     index=0;
     41     a[index]=S;
     42     pre[index]=-1;//广搜过程中,出发点没有前驱结点
     43     index++; 
     44     
     45     BFS();
     46     
     47     if(T.index==-1) printf("no way!
    ");
     48     else
     49     {
     50         //逆向输出路径 
     51         /*for(i=index-1;pre[i]>=0;)
     52         {
     53             printf("(%d,%d)
    ",a[i].xx,a[i].yy);
     54             i=pre[i];
     55         }
     56         printf("(%d,%d)
    ",S.xx,S.yy);
     57         */
     58         
     59         //正向输出路径 
     60         j=0;
     61         for(i=index-1;pre[i]>=0;)
     62         {
     63             tt[j]=a[i];
     64             j++;
     65             i=pre[i];
     66         }
     67         printf("(%d, %d)
    ",S.xx,S.yy);
     68         for(j=j-1;j>=0;j--)
     69         {
     70             printf("(%d, %d)
    ",tt[j].xx,tt[j].yy);
     71         }
     72     }
     73     return 0;
     74 }
     75 
     76 void BFS()
     77 {
     78     int i,txx,tyy;
     79     struct obj temp;
     80     
     81     q.push(S);
     82     while(!q.empty())
     83     {
     84         for(i=0;i<4;i++)
     85         {
     86             txx=q.front().xx+dx[i];
     87             tyy=q.front().yy+dy[i];
     88             if(txx>=0&&txx<n&&tyy>=0&&tyy<m&&map[txx][tyy]==0)
     89             {
     90                 temp.xx=txx;
     91                 temp.yy=tyy;
     92                 temp.index=index;
     93                 q.push(temp);
     94                 map[txx][tyy]=1;
     95                 
     96                 a[index]=temp;
     97                 pre[index]=q.front().index;
     98                 index++;
     99                 
    100                 if(temp.xx==T.xx&&temp.yy==T.yy)
    101                 {
    102                     T.index=temp.index;
    103                     return ;
    104                 }
    105             }
    106         }
    107         q.pop();
    108     }
    109 }
  • 相关阅读:
    Notepad++快捷键
    NAT123内网映射端口
    Maven 导出依赖Jar,生成source.jar,javadoc.jar
    自定义javascript log方法
    AmazeUI定制
    模板框架
    jquery checkbox全选 获取值
    首页导航点击A连接跳转并添加上背景色,
    Controller中的方法利用ip跨域访问
    Datatable转成List
  • 原文地址:https://www.cnblogs.com/huashanqingzhu/p/7267809.html
Copyright © 2011-2022 走看看