zoukankan      html  css  js  c++  java
  • POJ 3278:Catch That Cow

    Time Limit: 2000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u

     Status

    Description

    Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer John has two modes of transportation: walking and teleporting.

    * Walking: FJ can move from any point X to the points - 1 or + 1 in a single minute
    * Teleporting: FJ can move from any point X to the point 2 × X in a single minute.

    If the cow, unaware of its pursuit, does not move at all, how long does it take for Farmer John to retrieve it?

    Input

    Line 1: Two space-separated integers: N and K

    Output

    Line 1: The least amount of time, in minutes, it takes for Farmer John to catch the fugitive cow.

    Sample Input

    5 17

    Sample Output

    4

    Hint

    The fastest way for Farmer John to reach the fugitive cow is to move along the following path: 5-10-9-18-17, which takes 4 minutes.

    发现广度优先搜索适合什么题呢?就是那种在每个点都给你几个选择,然后问你最短路径的问题,对,就是这样,这样的题目最适合广度优先搜索。

    这次的这个就是,每次Farmer有三个选择,然后求最短到达目的地的行程。简直是广搜的模板题。

    代码:

    #include <iostream>
    #include <algorithm>
    #include <cmath>
    #include <vector>
    #include <string>
    #include <queue>
    #include <cstring>
    #pragma warning(disable:4996)
    using namespace std;
    
    int color[1000005];
    int dis[1000005];
    
    queue<int> q;
    
    int main()
    {
    	//freopen("i.txt","r",stdin);
    	//freopen("o.txt","w",stdout);
    
    	int N,K;
    	cin>>N>>K;
    	
    	if(N==K)
    	{
    		cout<<0<<endl;
    	}
    	else
    	{
    		memset(color,0,sizeof(color));
    		memset(dis,0,sizeof(dis));
    
    		q.push(N);
    		while(!q.empty())
    		{
    			N=q.front();
    			q.pop();
    			if(N-1==K || N+1==K || 2*N==K)
    			{
    				cout<<dis[N]+1<<endl;
    				break;
    			}
    
    			if(color[N-1]==0 && N-1>=0)
    			{
    				color[N-1]=1;
    				dis[N-1]=dis[N]+1;
    				q.push(N-1);
    			}
    			if(color[N+1]==0)
    			{
    				color[N+1]=1;
    				dis[N+1]=dis[N]+1;
    				q.push(N+1);
    			}
    			if(color[2*N]==0 && 2*N<=100000)
    			{
    				color[2*N]=1;
    				dis[2*N]=dis[N]+1;
    				q.push(2*N);
    			}
    		}
    	}
    	return 0;
    }
    


    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    ECS内网穿透
    设置服务器ssh会话时间
    VScode插件
    Linux拷贝U盘文件(命令行)
    打开IDM下载视频时弹出防火墙阻止下载,解决方案
    如何将jmeter.bat命令文件固定到任务栏
    jmeter安装教程
    安装JDK8.0(JDK1.8) & 环境变量配置 & idea中配置java路径
    教你不用任何第三方软件实现任务栏居中
    [Unity优化]gc03:代码优化
  • 原文地址:https://www.cnblogs.com/lightspeedsmallson/p/4785824.html
Copyright © 2011-2022 走看看