• A strange lift


    创建一个结构体, 该结构体存储 当前所在楼层 和 当前已走的步数

    使用广搜, 将初始节点入队, 并做上已访问的标记, 判断当前节点是否为终点, 若是终点则返回到当前为止走过的步数, 若不是终点, 则将该节点可以访问到的孩子结点入队(同时将孩子结点做上已经访问过的标记)(当前节点出队), 依次判断, 直至队列为空

    #include <iostream> 
    #include <cstring>
    #include <queue>
    using namespace std;
    
    struct F
    {
    	int floor;	// 当前所在楼层 
    	int step;	// 当前走的步数
    	F() {}
    	F(int x, int y):floor(x), step(y) {} 
    };
    
    int a, b, n;
    int c[210], vis[210];
    
    int bfs()
    {
    	queue<F> q;
    	F p, m, t;
    	p = F(a, 0);
    	vis[p.floor] = 1;
    	q.push(p);
    	while(!q.empty())
    	{
    		m = q.front();
    		q.pop();
    		
    		// 成功返回 
    		if(m.floor == b)	return m.step;
    		
    		if(m.floor + c[m.floor] <= n && !vis[m.floor + c[m.floor]])
    		{
    			t.floor = m.floor + c[m.floor];
    			t.step = m.step + 1;
    			vis[t.floor] = 1;
    			q.push(t);
    		}
    		
    		if(m.floor - c[m.floor] >= 1 && !vis[m.floor - c[m.floor]])
    		{
    			t.floor = m.floor - c[m.floor];
    			t.step = m.step + 1;
    			vis[t.floor] = 1;
    			q.push(t);
    		}
    	}
    	return -1;
    }
    
    int main()
    {
    	while(cin >> n)
    	{
    		if(n == 0)	break;
    		
    		memset(c, 0, sizeof(c));
    		memset(vis, 0, sizeof(vis)); 
    		cin >> a >> b;
    		for(int i = 1; i <= n; ++ i)
    		{
    			cin >> c[i];
    		}
    		cout << bfs() << endl;
    	}
    	
    	return 0;
    }
    
    /*
    Sample Input:
    5 1 5
    3 3 1 2 5
    0
    Sample Output:
    3
    */
    

      

      

      

  • 相关阅读:
    一个不确定内容的数组,统计每个元素出现的次数的方法
    WebStorm配置TSLint
    angualr 项目环境搭建
    angular6 导出json数据到excal表
    angular6 引用echart第一次数据不显示解决
    angular6 开发实践基础知识汇总
    angular6实现对象转换数组对象
    angular 实现左侧和顶部固定定位布局
    ASP.NET MVC 全局异常
    IOC容器之Autofac
  • 原文地址:https://www.cnblogs.com/mjn1/p/11558984.html
Copyright © 2020-2023  润新知