#4,9,10 WA,求教
查看原帖
#4,9,10 WA,求教
868063
_Coffice_楼主2022/12/16 19:36

上代码:

#include<iostream>
using namespace std;

bool bj[10000];//到过的楼层标记 
int main(){
	int n,//楼层总数 
		a,//起始位置 
		b;//终点位置
	scanf("%d%d%d",&n,&a,&b); //输入三个数据
	int k[n+10];//每一层楼上的电梯数字
	for(int i = 1;i<=n;i++) 
		scanf("%d",&k[i]);//循环输入n层楼上的数字
	if(a == b){//如果起始楼层就是结束楼层 
		printf("%d",0);//直接不用广搜输出0
		return 0;//结束 
	}
	int qe[10000];//广搜队列
	int i = 0,//首位 
		j = 1;//末尾
	qe[1] = a;//初始节点为开始楼层 
	bj[a] = 1;//标记初始节点走过 
	int sum = 0;//路线总长 
	while(i<j){//队列非空 
		i++;//i为树根,当前楼层
		sum++;
		//int jf = j; 
		for(int t = 1;t<=2;t++){//每一层有上与下两个选择 
			if(t == 1){//上 
				int f = qe[i]+k[qe[i]];
				//到达楼层为当前楼层+该层数字 
				if(f <= n && bj[f] == 0){
					//如果这一层没有越界且曾经没有到过 
					bj[f] = 1;//标记上,曾经来过
					j++;//从尾部腾出空间 
					qe[j] = f; //入队
				}
			}else if(t == 1){//下 
				int f = qe[i]+k[qe[i]];
				//到达楼层为当前楼层-该层数字 
				if(f > 0 && bj[f] == 0){
					//如果这一层没有越界且曾经没有到过 
					bj[f] = 1;//标记上,曾经来过
					j++;//从尾部腾出空间 
					qe[j] = f; //入队
				}
			}
			if(qe[j] == b){//如果入队的节点就是目标节点 
				printf("%d",sum);//输出路线长度 
				return 0;//结束 
			}
		}
//		if(j > jf){//如果在这次上下中,有成员入队 
//			sum++;//将路程长度+1 
//		} 
	}
	cout << -1;
	//如果遍历所有节点,依旧无法到达终点,输出无解-1 
	return 0;//结束 
}
2022/12/16 19:36
加载中...