zoukankan      html  css  js  c++  java
  • bfs

    #include<iostream>
    using namespace std;
    #include<string.h>
    #include<queue>
    int vis[1000];
    struct node{
    	int x,step;
    }; 
    int a,b;
    bool check(int k)
    {
    	if(k>1000||k<0||vis[k==1])return false;
    	return true;
    }
    queue<node> q;
    int bfs(int a,int b)
    {
    	while(!q.empty())q.pop();
    	vis[a]=1; q.push({a,0});
    	while(!q.empty())
    	{
    		node ss=q.front();
    		if(ss.x==b)return ss.step;
    		q.pop();
    		if(check(ss.x+1))
    		{
    			vis[ss.x+1]=1;
    			q.push({ss.x+1,ss.step+1});
    		}
    			if(check(ss.x-1))
    		{
    			vis[ss.x-1]=1;
    			q.push({ss.x-1,ss.step+1});
    		}
    			if(check(ss.x*2))
    		{
    			vis[ss.x*2]=1;
    			q.push({ss.x*2,ss.step+1});
    		}
    	}
    //	return -1;
    }
    int main()
    {
    	while(cin>>a>>b)
    	{
    		memset(vis,0,sizeof(vis));
    		cout<<bfs(a,b)<<endl;
    	}
    	return 0;
    }
    

      

    有一个奇怪的电梯可以停止在任何一个你想去的楼层,并且在每个楼层有一个Ki(0 <= Ki <= N)。电梯只有两个按钮:上下。当你在第i层,如果你按下“UP”按钮,你将上升到Ki楼层,也就是说,你将会到达第i + Ki层,如果你按下“DOWN”按钮,你将会下降Ki楼层,即您将前往第i层。当然,电梯不能高于N,并且不能低于1.例如,有5层的建筑物,并且k1 = 3,k2 = 3,k3 = 1,k4 = 2,k5 = 5。从1楼开始,你可以按下“UP”按钮,你会到4楼,如果你按下“DOWN”按钮,电梯不能做它,因为它不能下到-2楼,如你所知,-2楼是不存在的。
    问题出在这里:当你在A楼,而你想去B楼时,至少他必须按下“UP”或“DOWN”按钮多少次?
    输入
    输入包含多个测试用例。每个测试用例包含两行。
    第一行包含上述三个整数N,A,B(1 <= N,A,B <= 200),第二行由N个整数k1,k2,... kn组成。
    单个0表示输入结束。
    产量
    对于每种情况的输入输出一个整数,最少的次数,你必须按下按钮,当你在A楼,而你想要去B楼。如果你不能达到B层,printf“-1”。
    示例输入
    5 1 5
    3 3 1 2 5
    0
    示例输出
    3

    #include<iostream>
    #include<string.h>
    #include<queue>
    using namespace std;
    int N, A, B;
    int k[10000];
    int vis[10000];
    struct Node
    {
            int f, step;
    };
    queue<Node> q;
    bool check(int n)
    {
            if(n > N || n <= 0 || vis[n])
                    return false;
            return true;
    }
    int bfs()
    {
    
            while(!q.empty())
                    q.pop();//////////
            vis[A] = 1;
            q.push(Node{A, 0});
            while(!q.empty())
            {
                    Node ss = q.front();
                    if(ss.f == B)
                            return ss.step;
                    q.pop();
                    if(check(ss.f + k[ss.f]))
                    {
                            vis[ss.f + k[ss.f]] = 1;
                            q.push(Node{ss.f + k[ss.f], ss.step + 1});
                    }
                    if(check(ss.f - k[ss.f]))
                    {
                            vis[ss.f - k[ss.f]] = 1;
                            q.push(Node{ss.f - k[ss.f], ss.step + 1});
                    }
            }
            return -1;
    }
    int main()
    {
            while(cin>>N && N != 0)
            {
                    cin>>A>>B;
                    for(int i = 1; i <= N; i++)
                            cin>>k[i];
                    memset(vis, 0, sizeof(vis));
                    cout<<bfs()<<endl;
            }
            return 0;
    }
    

      

  • 相关阅读:
    LeetCode 24. Swap Nodes in Pairs (两两交换链表中的节点)
    LeetCode 1041. Robot Bounded In Circle (困于环中的机器人)
    LeetCode 1037. Valid Boomerang (有效的回旋镖)
    LeetCode 1108. Defanging an IP Address (IP 地址无效化)
    LeetCode 704. Binary Search (二分查找)
    LeetCode 744. Find Smallest Letter Greater Than Target (寻找比目标字母大的最小字母)
    LeetCode 852. Peak Index in a Mountain Array (山脉数组的峰顶索引)
    LeetCode 817. Linked List Components (链表组件)
    LeetCode 1019. Next Greater Node In Linked List (链表中的下一个更大节点)
    29. Divide Two Integers
  • 原文地址:https://www.cnblogs.com/zhangshuyao/p/8627393.html
Copyright © 2011-2022 走看看