• POJ 3984


    题意:给你5*5的矩阵,要求你从左上角(0,0)走到右下角(4,4)的最短路径。

    题解:用对路径用bf,我们记住每个点的前驱,输出用dfs

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <cstdlib>
     4 #include <cctype>
     5 #include <cmath>
     6 #include <time.h>
     7 #include <string>
     8 #include <map>
     9 #include <stack>
    10 #include <set>
    11 #include <queue>
    12 #include <vector>
    13 #include <algorithm>
    14 #include <iostream>
    15 using namespace std;
    16 typedef long long ll;
    17 #define PI acos( -1.0 )
    18 typedef pair<int, int> P;
    19 const double E = 1e-8;
    20 const int NO = 100 + 5;
    21 int a[10][10], dx[10][10], dy[10][10];
    22 int mark[10][10];
    23 int dir[][2] = { {-1,0}, {1,0}, {0,-1}, {0,1} };
    24 
    25 void output( int x, int y )
    26 {
    27     if( x == 0 && y == 0 )
    28     {
    29         printf( "(0, 0)
    " );
    30         return;
    31     }
    32     output( dx[x][y], dy[x][y] );
    33     printf( "(%d, %d)
    ", x, y );
    34 }
    35 
    36 void bfs()
    37 {
    38     queue <P> q;
    39     memset( mark, 0, sizeof( mark ) );
    40     memset( dx, 0, sizeof( dx ) );
    41     memset( dy, 0, sizeof( dy ) );
    42     q.push( P( 0, 0 ) );
    43     dx[0][0] = dy[0][0] = -1;
    44     while( !q.empty() )
    45     {
    46         P t = q.front(); q.pop();
    47         if( t.first == 4 && t.second == 4 )
    48         {
    49             output( 4, 4 );
    50             return;
    51         }
    52         for( int i = 0; i < 5; ++i )
    53         {
    54             int xx = dir[i][0] + t.first;
    55             int yy = dir[i][1] + t.second;
    56             if( xx >= 0 && xx < 5 && yy >= 0 && yy < 5 && !mark[xx][yy] && a[xx][yy] == 0 )
    57             {
    58                 mark[xx][yy] = 1;
    59                 dx[xx][yy] = t.first;
    60                 dy[xx][yy] = t.second;
    61                 q.push( P( xx, yy ) );
    62             }
    63         }
    64     }
    65 }
    66 
    67 int main()
    68 {
    69     for( int i = 0; i < 5; ++i )
    70         for( int j = 0; j < 5;++j )
    71             scanf( "%d", &a[i][j] );
    72     bfs();
    73     return 0;
    74 }
    View Code
  • 相关阅读:
    9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路(转)
    Path Sum(参考别人,二叉树DFS)
    tcp/ip
    常见Unix指令
    Pascal's Triangle II
    Implement strStr()
    LeetCode总结
    从LLVM源码学C++(一)
    面试题:1到N中,1出现的次数
    面试题:数组划分成两个子数组,和的差值的绝对值最小
  • 原文地址:https://www.cnblogs.com/ADAN1024225605/p/4087491.html
Copyright © 2020-2023  润新知