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;
    }
    

      

  • 相关阅读:
    sabaki and leelazero
    apply current folder view to all folders
    string operation in powershell
    wirte function in powershell
    add environment path to powershell
    Module in powershell
    sql prompt
    vmware中鼠标在部分区域不能使用
    调整多个控件的dock的顺序
    行为型模型 策略模式
  • 原文地址:https://www.cnblogs.com/zhangshuyao/p/8627393.html
Copyright © 2011-2022 走看看