• POJ 3984 迷宫问题


    迷宫问题
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 49149   Accepted: 26684

    Description

    定义一个二维数组: 

    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表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

    Input

    一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。

    Output

    左上角到右下角的最短路径,格式如样例所示。

    Sample Input

    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

    Sample Output

    (0, 0)
    (1, 0)
    (2, 0)
    (2, 1)
    (2, 2)
    (2, 3)
    (2, 4)
    (3, 4)
    (4, 4)

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <queue>
      4 
      5 using namespace std;
      6 
      7 typedef pair<int,int> P;
      8 
      9 const int INF = 1e8;
     10 
     11 const int N=5,M=5;
     12 int maze[N][M],d[N][M];
     13 int sx=0,sy=0;
     14 int gx=4,gy=4;
     15 
     16 int dx[2]={0,1},dy[2]={1,0};
     17 
     18 struct
     19 {
     20     int x;
     21     int y;
     22 }pre[N][M];
     23 
     24 void bfs()
     25 {
     26     // 初始化队列
     27     queue<P> que;
     28     // 初始化距离
     29     for(int i=0;i<N;++i)
     30     {
     31         for(int j=0;j<M;++j)
     32         {
     33             d[i][j]=INF;
     34         }
     35     }
     36     d[0][0]=0;
     37     que.push(P(0,0));
     38     //
     39     while(que.size())
     40     {
     41         // 取出元素
     42         P p=que.front();
     43         que.pop();
     44         // 找到终点
     45         if(p.first==gx && p.second==gy)
     46         {
     47             break;
     48         }
     49         // 左和下找其余可行顶点
     50         for(int i=0;i<2;++i)
     51         {
     52 
     53             int nx=p.first+dx[i];
     54             int ny=p.second+dy[i];
     55             //printf("%d %d
    ",nx,ny);
     56             if(nx>=0 && nx<N && ny>=0 && ny<M && maze[nx][ny]==0 && d[nx][ny]==INF)
     57             {
     58                 que.push(P(nx,ny));
     59                 d[nx][ny]=d[p.first][p.second]+1;
     60                 // 记录前一节点
     61                 pre[nx][ny].x=p.first;
     62                 pre[nx][ny].y=p.second;
     63             }
     64         }
     65     }
     66 
     67 }
     68 
     69 void dfs(int nx,int ny)
     70 {
     71     if(pre[nx][ny].x==0 && pre[nx][ny].y==0)
     72     {
     73         printf("(0, 0)
    ");
     74         printf("(%d, %d)
    ",nx,ny);
     75         return;
     76     }
     77 
     78     dfs(pre[nx][ny].x,pre[nx][ny].y);
     79     printf("(%d, %d)
    ",nx,ny);
     80 
     81 }
     82 
     83 void solve()
     84 {
     85     bfs();
     86     if(d[gx][gy]==INF)
     87     {
     88         printf("NO
    ");
     89     }
     90     else
     91     {
     92         dfs(gx,gy);
     93     }
     94 }
     95 
     96 int main()
     97 {
     98     for(int i=0;i<N;++i)
     99     {
    100         for(int j=0;j<M;++j)
    101         {
    102             scanf("%d",&maze[i][j]);
    103         }
    104     }
    105     solve();
    106     return 0;
    107 }
  • 相关阅读:
    .NET之权限管理
    .NET之带星期的日期显示
    ASP.net MVC 同一view或页面使用多个Model或数据集的方法
    ISBN号校检程序(C#与SQL版)
    ASP操作类似多维Cookies
    C# webBrowser自动登陆windows集成验证方法
    JOI 系列乱做
    NOI2021 部分题解
    「NEERC 2015」Jump 题解
    CF/AT 乱做
  • 原文地址:https://www.cnblogs.com/jishuren/p/12244718.html
Copyright © 2020-2023  润新知