• poj 3278 Catch That Cow


    题意:一个人站在N点,一头牛站在K点,这个人要到达牛的位置,他每分钟只能到达N+1,N-1,和2*N的位置,求最少要多少分钟。

    思路:好久不做搜索题竟然将它忘的干干净净了,唉。这题让求最少时间,当然用BFS,开始做的时候竟然没想起来,然后做的时候,竟然将队列写成了栈,浪费了好长时间,看来还要坚强训练啊。

    代码:

    View Code
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #define  N  100005
    using namespace std ;
    
    struct node
    {
        int num ;
        int step ;
    };
    
    int f[N] ;
    
    int main()
    {
        int n , k ;
    
        while ( scanf ( "%d%d" , &n , &k ) != EOF )
        {
            //n和k相等
            if ( n == k )
            {
                printf ( "0\n" );
                continue ;
            }
            //若n>k,则他只能通过每次N-1的方式到达。
            else if ( n > k )
            {
                printf ( "%d\n" , n - k );
                continue ;
            }
            //否则,BFS搜索。
            else
            {
                queue<node>q ;
                node p , t , x ;
                memset( f , 0 , sizeof ( f )) ;
                p.num = n ;
                p.step = 0 ;
                q.push( p );
                f[n] = 1 ;
                int minx = N ;
                while ( !q.empty())
                {
                    t = q.front();
                    q.pop();
                    if ( t.num == k )
                    {
                        if ( minx > t.step )
                        minx = t.step ;
                        continue ;
                    }
                    if ( t.num - 1 > n/2 && !f[t.num - 1])
                    {
                        f[t.num-1] = 1 ;
                        x.num = t.num - 1 ;
                        x.step = t.step + 1 ;
                        q.push( x );
                    }
                    if ( t.num + 1 <= k + 1 && !f[t.num + 1])
                    {
                        f[t.num+1] = 1 ;
                        x.num = t.num + 1 ;
                        x.step = t.step + 1 ;
                        q.push( x );
                    }
                    if ( 2 * t.num <= k + 1 && !f[2*t.num])
                    {
                        f[2*t.num] = 1 ;
                        x.num = 2 * t.num ;
                        x.step = t.step + 1 ;
                        q.push( x );
                    }
                }
                printf ( "%d\n" , minx );
            }
        }
        return 0 ;
    }
  • 相关阅读:
    AudioStreamer电话打进时崩溃
    ios中NSLog输出格式大全
    IOS Framework制作(一)
    UIButton上的文字添加阴影
    Tim Cook向员工发邮件,祝贺大家实现创纪录的季度
    ios 通讯录“写”操作大全
    AVAudioSession的Category
    IOS播放优酷视频
    iOS 设备的网页调试工具Firebug
    iOS中retain和copy的区别
  • 原文地址:https://www.cnblogs.com/misty1/p/2717317.html
Copyright © 2020-2023  润新知