zoukankan      html  css  js  c++  java
  • HDU 1026 Ignatius and the Princess I (BFS)

    题目链接

    题意 : 从(0,0)点走到(N-1,M-1)点,问最少时间。

    思路 : BFS、、、、、

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <queue>
     4 #include <iostream>
     5 
     6 using namespace std ;
     7 
     8 struct node
     9 {
    10     int x,y ;
    11     int tim ;
    12     friend bool operator < (node a,node b)
    13     {
    14         return a.tim > b.tim ;
    15     }
    16 } temp,temp1;
    17 int N,M ,t;
    18 char mapp[110][110] ;
    19 int vis[110][110] ;
    20 int dir[4][2] = {{-1,0},{1,0},{0,-1},{0,1}} ;
    21 
    22 int BFS()
    23 {
    24     temp.x = 0 ;
    25     temp.y = 0 ;
    26     temp.tim = 0 ;
    27     priority_queue<node>Q ;
    28     Q.push(temp) ;
    29    // vis[0][0] = true ;
    30     while(Q.size())
    31     {
    32         temp = Q.top() ;
    33         Q.pop() ;
    34         if(temp.x == N-1 && temp.y == M-1) return temp.tim ;
    35         for(int i = 0 ; i < 4 ; i++)
    36         {
    37             temp1.x = temp.x+dir[i][0] ;
    38             temp1.y = temp.y+dir[i][1] ;
    39             if(temp1.x >= 0 && temp1.y >= 0 && temp1.x <= N-1 && temp1.y <= M-1 && vis[temp1.x][temp1.y] == -1 && mapp[temp1.x][temp1.y] != 'X')
    40             {
    41                 vis[temp1.x][temp1.y] = temp.x*M+temp.y ;
    42                 if(mapp[temp1.x][temp1.y] == '.')
    43                     temp1.tim = temp.tim+1 ;
    44                 else
    45                     temp1.tim = temp.tim + mapp[temp1.x][temp1.y]-'0'+1 ;
    46                 Q.push(temp1) ;
    47             }
    48         }
    49     }
    50     return -1 ;
    51 }
    52 void print(int x,int y)
    53 {
    54     if(x == 0 && y == 0)
    55         return ;
    56     int xx = vis[x][y]/M ;
    57     int yy = vis[x][y]%M ;
    58     print(xx,yy) ;
    59     printf("%ds:(%d,%d)->(%d,%d)
    ",t++,xx,yy,x,y) ;
    60     if(mapp[x][y] >= '0' && mapp[x][y] <= '9')
    61     {
    62         while(mapp[x][y] -'0' > 0)
    63         {
    64             printf("%ds:FIGHT AT (%d,%d)
    ",t++,x,y) ;
    65             mapp[x][y] -- ;
    66         }
    67     }
    68 }
    69 int main()
    70 {
    71     while(~scanf("%d %d",&N,&M))
    72     {
    73         for(int i = 0 ; i < N ; i++ )
    74             scanf("%s",mapp[i]) ;
    75         memset(vis,-1,sizeof(vis)) ;
    76         int timee = BFS() ;
    77         if(timee == -1)
    78         {
    79             printf("God please help our poor hero.
    FINISH
    ") ;
    80         }
    81         else
    82         {
    83             t = 1 ;
    84             printf("It takes %d seconds to reach the target position, let me show you the way.
    ",timee) ;
    85             print(N-1,M-1) ;
    86             printf("FINISH
    ") ;
    87         }
    88     }
    89     return 0 ;
    90 }
    View Code
  • 相关阅读:
    C语言编程题
    boost-使用说明
    CButton控件
    sprintf()与sscanf()
    MFC中的几个虚函数
    CProgressCtrl进度条控件实现进度滚动效果
    移动窗口和根据条件查找指定窗口
    VC播放mp3的方法
    CEdit控件[转]
    关于鼠标的一些操作
  • 原文地址:https://www.cnblogs.com/luyingfeng/p/3969072.html
Copyright © 2011-2022 走看看