文章
20
粉丝
147
获赞
13
访问
51.1k
这显然是一道 bfs 的题了,需要注意的就是是否加入队列的判断条件,需要加一个数组,来判断这一楼层是否到过,因为要找最短路径嘛,肯定是在不同的楼层了,这样也避免了这一楼层数字为0,一直在这一个楼层和几个楼层来回去,不断循环的情况。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
const int N = 205;
int n, a, b, flag, sum;
//arr数组用来存不同楼层的数字,pre数组用来存这一楼层的上一楼层
//例如pre[x] = y就是x的上一楼层是y,类似并查集中的,哈哈哈
int arr[N], pre[N];
int book[N];
queue<int> q;
//递归
void sumj(int x)
{
if(x == a){//终止条件
sum ++;
return;
}
x = pre[x];
sum ++;
sumj(x);
}
//bfs模板
void bfs()
{
q.push(a);
while(!q.empty()){
int t = q.front();
q.pop();
int x = t + arr[t];
int y = t - arr[t];
//大于0且小于n且这一楼层未访问过
if(x > 0 && x <= n && book[x] != 1){
//标记已经访问过
book[x] = 1;
q.push(x);
pre[x] = t;
if(x == b){
/...
登录后发布评论
暂无评论,来抢沙发