社区讨论

两个小问题(想不出标题了)

B3626跳跃机器人参与者 3已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@mhj2pqth
此快照首次捕获于
2025/11/03 19:45
4 个月前
此快照最后确认于
2025/11/03 19:45
4 个月前
查看原帖
CPP
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<cstdio>

#include<vector>
#include<queue>

using namespace std;

int n;

bool check(int x){
	if(x<=0||x>n){
		return false;
	}
	else{
		return true;
	}
}

void bfs(){
	queue <int> q;
	vector <int> dis(n,-1);
	vector <bool> vis(n,false);
	q.push(1);
	dis[1]=0;
	vis[1]=true;
	while(!q.empty()){
		int cur=q.front();
		q.pop();
		if(check(cur+1)&&!vis[cur+1]){
			vis[cur+1]=true;
			q.push(cur+1);
			dis[cur+1]=dis[cur]+1;
		}
		if(check(cur-1)&&!vis[cur-1]){
			vis[cur-1]=true;
			q.push(cur-1);
			dis[cur-1]=dis[cur]+1;
		}
		if(check(cur*2)&&!vis[cur*2]){
			vis[cur*2]=true;
			q.push(cur*2);
			dis[cur*2]=dis[cur]+1;
		}
	}
	cout<<dis[n]<<endl;
	return;
}

int main(){
	cin>>n;
	bfs();
//cout<<"error"<<endl;
	return 0;
}
第一个问题:此代码可以通过本题,但是在本地编译时,输入30,并不会执行到//cout<<"error"<<endl部分,且在输出答案6后有显著卡顿?不知道为什么。
第二个问题:在bfs()函数的while()循环中以下部分
CPP
if(check(cur+1)&&!vis[cur+1]){
			vis[cur+1]=true;
			q.push(cur+1);
			dis[cur+1]=dis[cur]+1;
}
if(check(cur-1)&&!vis[cur-1]){
			vis[cur-1]=true;
			q.push(cur-1);
			dis[cur-1]=dis[cur]+1;
}
if(check(cur*2)&&!vis[cur*2]){
			vis[cur*2]=true;
			q.push(cur*2);
			dis[cur*2]=dis[cur]+1;
}
我一开始错误地写成
CPP
vis[cur]=true;
if(check(cur+1)&&!vis[cur+1]){
			q.push(cur+1);
			dis[cur+1]=dis[cur]+1;
}
if(check(cur-1)&&!vis[cur-1]){
			q.push(cur-1);
			dis[cur-1]=dis[cur]+1;
}
if(check(cur*2)&&!vis[cur*2]){
			q.push(cur*2);
			dis[cur*2]=dis[cur]+1;
}
导致错误,但我并未完全理解为什么这样会产生错误,希望dalao为我详细说明一下。
球解答

回复

7 条回复,欢迎继续交流。

正在加载回复...