洛谷P1135 奇怪的电梯(c嘎嘎解题)

解题过程:

这道题本开始就想到了深搜dfs,即一条路搜到底然后回溯,请看代码

#include<bits/stdc++.h>//万能头文件 
using namespace std;
typedef long long ll;
const int N = 210;//宏定义 
int k[N],d[N];
int n,a,b;//全局变量 

void dfs(int layer,int step)//深搜,递归求解 
{
	d[layer] = step;//到达当前楼层所用的步数 
	int t = layer - k[layer];//中间变量表示电梯向下移动后的层数 
	if(t >= 1 && step + 1 < d[t]) dfs(t,step + 1);//向下后所处层数要满足大于等于1,step + 1 < d[t]即更新到达当前楼层所用的最少步数 
	t = layer + k[layer];//中间变量表示电梯向下移动后的层数 
	if(t <=n && step + 1 < d[t]) dfs(t,step + 1); //向上后所处层数要满足小于等于n ,同理 
}
int main()
{
    ios::sync_with_stdio(0);//iOS输入优化 
    cin.tie(0), cout.tie(0);//同上 
    
    cin >> n >> a >> b;//输入数据 n表示层数 
    
    for(int i=1; i<=n; i++) cin >> k[i];
    
    memset(d,0x3f,sizeof(d));//每个字节设置为0x3f表示数为无穷大 
    dfs(a,0);
    cout<<(d[b] == 0x3f3f3f3f ? -1 : d[b]);
   	  
    return 0;  
}

其实这道题也能用bfs更新,先将当前节点入队然后用当前节点更新其他节点信息,然后将当前节点出队,然后入队其他节点,以此往复。

bfs模板:

bfs()
{
       queue<int> q;//初始化队列Q 
       while(!q.empty())  //队列不为空
       {
               if() //判断是否找到了目标
               {

               }
               q.pop()//队首出队
               for()
               {
                       //依旧是四个方向
                       //符合条件的入队
                       //标记入队的点
               }
       }
}

接下来奉上bfs的代码希望能帮助有需要的帅哥美女们

#include<bits/stdc++.h>//万能头文件 
using namespace std;
typedef long long ll;
const int N = 210;//宏定义 
int k[N];
bool vis[N];
int n,a,b;
queue<pair<int,int>>q;//pair可以存两个数也可以用结构体 

int bfs()
{
	q.push({a,0});
	vis[a] = true;
	while(!q.empty())
	{
		int x = q.front().first,y = q.front().second;//取出队列中的数值 
		q.pop();//出队 
		if(x == b) return y;//找到答案直接返回 
		
		int xx = x + k[x],yy = y + 1;//向上 
		if(xx <=n && !vis[xx]) q.push({xx,yy}) ,vis[xx] = true;
		xx = x - k[x];//向下 
		if(xx >=1 && xx <=n && !vis[xx]) q.push({xx,yy}),vis[xx] = true;
	} 
	return -1;
} 
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    
    cin >> n >> a >> b;//输入数据 
    
    for(int i=1; i<=n; i++) cin >> k[i];
    

    
    cout<< bfs() <<'\n';
	
    
   	  
    return 0;  
}

看到这篇文章的集帅集美们如果我的有错误麻烦指出,感谢各位

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值