zoukankan      html  css  js  c++  java
  • HDU4308 (BFS)

    题意:从起点到终点

    bfs即可

    注意P的作用:一遇到P即将所有的P进队。

    View Code
     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<stdlib.h>
     4 #include<queue>
     5 #include<algorithm>
     6 using namespace std;
     7 const int maxn = 5005;
     8 const int inf=999999;
     9 char mat[ maxn ][ maxn ];
    10 bool vis[ maxn ][ maxn ];
    11 struct node{
    12     int x,y,s;
    13 }p,pp,tmp;
    14 struct node2{
    15     int x,y;
    16 }sump[ maxn ],mystart,myend;
    17 int n,m,cost;
    18 int ans;
    19 int cnt;//the sum of the "p"
    20 const int dx[]={0,0,1,-1};
    21 const int dy[]={1,-1,0,0};
    22 
    23 void bfs( ){
    24     p.x=mystart.x,p.y=mystart.y,p.s=0;
    25     memset( vis,0,sizeof( vis ) );
    26     vis[ p.x ][ p.y ]=1;
    27     queue<node>q;
    28     q.push( p );
    29     int temp_flag=-1;//用于统计"P"是否进队
    30     while( !q.empty() ){
    31         p=q.front(),q.pop();
    32         //printf("p.x:%d p.y:%d p.t:%d \n",p.x,p.y,p.s);
    33         //if( p.x==myend.x && p.y==myend.y ) ans=min( ans,p.s );
    34         for( int i=0;i<4;i++ ){
    35             pp.x=p.x+dx[ i ],pp.y=p.y+dy[ i ],pp.s=p.s;
    36             if( pp.x<0||pp.x>=n||pp.y<0||pp.y>=m ) continue;
    37             if( vis[ pp.x ][ pp.y ]==1 ||mat[ pp.x ][ pp.y ]=='#' ) continue;
    38             if( mat[ pp.x ][ pp.y ]=='*' ){
    39                 vis[ pp.x ][ pp.y ]=1;
    40                 pp.s=p.s+cost;
    41                 q.push( pp );
    42             }
    43             else if( mat[ pp.x ][ pp.y ]=='P' && temp_flag==-1 ){
    44                 temp_flag=1;
    45                 for( int k=0;k<cnt;k++ ){
    46                     tmp.x=sump[k].x,tmp.y=sump[k].y,tmp.s=pp.s;
    47                     vis[ tmp.x ][ tmp.y ]=1;
    48                     q.push( tmp );
    49                 }
    50             }
    51             else if( mat[ pp.x ][ pp.y ]=='C' ){
    52                 ans=min( ans,pp.s );
    53                 return ;
    54             }
    55         }
    56     }
    57     //return ans;
    58 }
    59 
    60 int main(){
    61     while( scanf("%d%d%d",&n,&m,&cost)!=EOF ){
    62         cnt=0;
    63         for( int i=0;i<n;i++ ){
    64             scanf("%s",mat[ i ]);
    65             for( int j=0;j<m;j++ ){
    66                 if( mat[ i ][ j ]=='Y' ) mystart.x=i,mystart.y=j;
    67                 else if( mat[ i ][ j ]=='C' ) myend.x=i,myend.y=j;
    68                 else if( mat[ i ][ j ]=='P' ){
    69                     sump[ cnt ].x=i;
    70                     sump[ cnt ].y=j;
    71                     cnt++;
    72                 }
    73             }
    74         }
    75         //printf("cnt:%d\n",cnt);
    76         ans=inf;
    77         bfs();
    78         if( ans==inf ) printf("Damn teoy!\n");
    79         else printf("%d\n",ans);
    80     }
    81     return 0;
    82 }
    keep moving...
  • 相关阅读:
    你不一定懂的cpu显示信息
    WebService之nginx+(php-fpm)结构模型剖析及优化
    Linux企业运维人员最常用150个命令汇总
    企业级Tomcat部署实践及安全调优
    CentOS 7.X 系统安装及优化
    Linux Sysstat性能监控工具安装及常见8个命令使用例子
    Linux监控命令整理(top,free,vmstat,iostat,mpstat,sar,netstat)
    Tomcat+redis+nginx配置
    循环控制-链表删除结点
    循环控制-链表反转(与创建链表)
  • 原文地址:https://www.cnblogs.com/xxx0624/p/2881359.html
Copyright © 2011-2022 走看看