HDU 1180(简单BFS)

题目意思有点不清 其实是可以在原地停留的 注意桥的变化与时间相关

 

用方向数组压缩代码  OK 以下是实现

 

 

 

#include  < iostream >
#include 
< queue >
using   namespace  std;

char  Map[ 21 ][ 21 ];
typedef 
struct   
{
    
long  mi,mj;
    
long  step;
}Node;

Node Start,End;

bool  hash[ 21 ][ 21 ];

long  dx[ 4 ] = { 0 , 0 , 1 , - 1 };
long  dy[ 4 ] = { 1 , - 1 , 0 , 0 };

long  M,N;

inline 
void  BFS()
{
    memset(hash,
0 , sizeof (hash));

    queue
< Node >  q;

    q.push(Start);

    Node t;

    
long  cost = 0 ;

    hash[Start.mi][Start.mj]
= true ;

    
while  ( ! q.empty())
    {
        t
= q.front();
        q.pop();

        
if  (End.mi == t.mi && End.mj == t.mj)
        {
            cost
= t.step;
            
break ;
        }

        
long  i;
        
for  (i = 0 ;i < 4 ; ++ i)
        {
            Node n;
            n.mi
= t.mi + dx[i];
            n.mj
= t.mj + dy[i];

            
if  (n.mi >= 0 && n.mi < M && n.mj >= 0 && n.mj < N && Map[n.mi][n.mj] != ' * ' &&! hash[n.mi][n.mj])
            {
                
if  (Map[n.mi][n.mj] == ' . ' || Map[n.mi][n.mj] == ' T ' )
                {
                    n.step
= t.step + 1 ;
                    q.push(n);    
                    hash[n.mi][n.mj]
= true ;
                }

                
if  (Map[n.mi][n.mj] == ' - ' )
                {
                    
if  ((t.step & 1 ) == 0 )
                    {
                        
if (n.mi == t.mi)
                        {
                            n.mj
= n.mj + n.mj - t.mj;
                            n.step
= t.step + 1 ;
                            
                            
if (n.mi >= 0 && n.mi < M && n.mj >= 0 && n.mj < N &&! hash[n.mi][n.mj] && Map[n.mi][n.mj] != ' * ' )
                            {
                                q.push(n);
                                hash[n.mi][n.mj]
= true ;
                                hash[t.mi][t.mj]
= true ;
                            }
                        }
                        
else
                        {
                            n.mi
= t.mi;
                            n.mj
= t.mj;
                            n.step
= t.step + 1 ;
                            q.push(n);
                        }
                    }
                    
else
                    {
                        
if (n.mj == t.mj)
                        {
                            n.mi
= n.mi + n.mi - t.mi;
                            n.step
= t.step + 1 ;        
                            
if (n.mi >= 0 && n.mi < M && n.mj >= 0 && n.mj < N &&! hash[n.mi][n.mj] && Map[n.mi][n.mj] != ' * ' )
                            {
                                q.push(n);
                                hash[n.mi][n.mj]
= true ;
                                hash[t.mi][t.mj]
= true ;
                            }
                        }
                        
else
                        {
                            n.mi
= t.mi;
                            n.mj
= t.mj;
                            n.step
= t.step + 1 ;
                            q.push(n);
                        }
                    }
                }

                
if  (Map[n.mi][n.mj] == ' | ' )
                {
                    
if  (t.step & 1 )
                    {
                        
if (n.mi == t.mi)
                        {
                            n.mj
= n.mj + n.mj - t.mj;
                            n.step
= t.step + 1 ;
                            
                            
if (n.mi >= 0 && n.mi < M && n.mj >= 0 && n.mj < N &&! hash[n.mi][n.mj] && Map[n.mi][n.mj] != ' * ' )
                            {
                                q.push(n);
                                hash[n.mi][n.mj]
= true ;
                                hash[t.mi][t.mj]
= true ;
                            }
                        }
                        
else
                        {
                            n.mi
= t.mi;
                            n.mj
= t.mj;
                            n.step
= t.step + 1 ;
                            q.push(n);
                        }
                    }
                    
else
                    {
                        
if (n.mj == t.mj)
                        {
                            n.mi
= n.mi + n.mi - t.mi;
                            n.step
= t.step + 1 ;
                            
                            
if (n.mi >= 0 && n.mi < M && n.mj >= 0 && n.mj < N &&! hash[n.mi][n.mj] && Map[n.mi][n.mj] != ' * ' )
                            {
                                q.push(n);
                                hash[n.mi][n.mj]
= true ;
                                hash[t.mi][t.mj]
= true ;
                            }
                        }
                        
else
                        {
                            n.mi
= t.mi;
                            n.mj
= t.mj;
                            n.step
= t.step + 1 ;
                            q.push(n);
                        }
                    }

                }
            }
        }    
    }
    
// 题目保证可达
    printf( " %ld\n " ,cost);

}

int  main()
{
    
    
while  (scanf( " %ld %ld " , & M, & N) != EOF)
    {
        
long  i,j;
        getchar();
        
for  (i = 0 ;i < M; ++ i)
        {
            gets(Map[i]);
            
for  (j = 0 ;j < N; ++ j)
            {
                
if  (Map[i][j] == ' S ' )
                {
                    Start.mi
= i;
                    Start.mj
= j;
                    Start.step
= 0 ;
                }

                
if  (Map[i][j] == ' T ' )
                {
                    End.mi
= i;
                    End.mj
= j;
                }
            }
        }

        BFS();

    }

    
return   0 ;
}

转载于:https://www.cnblogs.com/zhuangli/archive/2008/09/13/1290324.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值