5 条题解
-
3
这一题怎么没有题解?是太简单了?
#include<bits/stdc++.h> using namespace std; int n,a,b,k[205],ans = 1e9,used[205],dis[205]; bool pd(int k) //判断是否在范围内 { if (k < 1 || k > n || used[k] == 1) return 0; return 1; } void bfs() //用bfs简单一些 { queue<int> q; q.push(a); used[a] = 1; while (!q.empty()) { int now = q.front(); q.pop(); int x = now+k[now]; if (pd(x)) { q.push(x); used[x] = 1; dis[x] = dis[now]+1; } x = now-k[now]; if (pd(x)) { q.push(x); used[x] = 1; dis[x] = dis[now]+1; } if (now == b) { cout << dis[now] << endl; exit(0); } } cout << -1 << endl; } int main() { ios::sync_with_stdio(false); //加速cin和cout cin.tie(0); cout.tie(0); cin >> n >> a >> b; for (int i = 1;i <= n;i++) { cin >> k[i]; } bfs(); return 0; }
-
2
这道题明显是一道广搜(BFS),核心思路就是求最短路程(当然也可以用深搜DFS,但是BFS的效率是要高于DFS的 在此之前我们先了解一下什么是广搜BFS
广度优先搜索(Breadth-First Search,简称BFS)是一种遍历或搜索树或图的算法,它从一个节点开始,逐层遍历节点,直到找到目标节点或所有节点都被访问过为止。BFS常用于寻找最短路径、检测图的连通性等场景。
BFS的主要特点和定义如下:
- 层次遍历:BFS从根节点(或任意节点)开始,逐层遍历节点,即先访问所有与起始节点相邻的节点,然后是这些节点的邻居,依此类推。
- 队列的使用:BFS使用队列作为其主要的数据结构。在搜索过程中,新发现的节点被添加到队列的末尾,而队列的前端节点则被取出进行处理。
- 访问标记:为了跟踪哪些节点已经被访问过,BFS通常使用一个访问标记数组(或集合),当节点从队列中取出时,会将其标记为已访问,以避免重复访问。
- 最短路径:在加权图中,BFS可以用于找到从起始节点到其他节点的最短路径(在无权图中,所有边的权重相同)。这是因为BFS按层次访问节点,所以它能够保证在找到目标节点时,所经过的路径是最短的。
- 时间复杂度:在最坏的情况下,BFS的时间复杂度为O(V+E),其中V是顶点数,E是边数。这是因为BFS可能会访问图中的每个顶点和每条边。
- 空间复杂度:BFS的空间复杂度也是O(V),因为需要存储访问标记数组和队列中的节点。
- 图的类型:BFS可以应用于有向图、无向图、加权图和无权图。但在有向图中,BFS只能找到从起始节点出发的最短路径,而不是到达起始节点的最短路径。
- 应用场景:BFS在许多领域都有应用,包括网络路由算法、社交网络分析、搜索引擎的爬虫算法、解决八皇后问题等。
C++代码如下
#include <bits/stdc++.h>//万能头文件 using namespace std; const int N=202;//常量N struct node{int f,c;};//定义一个数据结构分别存放 queue<node> Q;//创建一个队列 int n,a,b,k[N],v[N];//v作为标记数组,查看是否访问过了 int main(){ cin>>n>>a>>b; for(int i=1;i<=n;i++) scanf("%d",&k[i]); node f={a,0}; Q.push(f); v[a]=1; int lf=f.f,lc=f.c; while(!Q.empty()){ f=Q.front();//读取队列最前方 Q.pop();出队 lf=f.f,lc=f.c; if(lf==b) break;//判断有没有满足到达楼层,若是就退出循环 for(int i=-1;i<=1;i+=2){ int nf=lf+i*k[lf],nc=lc+1;//计算新节点的编号`nf`和步数`nc`。 if(nf>=1&&nf<=n&&v[nf]==0){//判断有没有越界及是否被访问过 node tp={nf,nc}; Q.push(tp); v[nf]=1; //表示已经被访问过了 } } } if(lf==b) cout<<f.c;//最后进行判断 else cout<<"-1"; return 0; }
~~点个赞吧,嗨呀
-
-1
#include<bits/stdc++.h> using namespace std; int n,a,b,k[205],ans = 1e9,used[205],dis[205]; bool pd(int k) //判断是否在范围内 { if (k < 1 || k > n || used[k] == 1) return 0; return 1; } void bfs() //用bfs简单一些 { queue<int> q; q.push(a); used[a] = 1; while (!q.empty()) { int now = q.front(); q.pop(); int x = now+k[now]; if (pd(x)) { q.push(x); used[x] = 1; dis[x] = dis[now]+1; } x = now-k[now]; if (pd(x)) { q.push(x); used[x] = 1; dis[x] = dis[now]+1; } if (now == b) { cout << dis[now] << endl; exit(0); } } cout << -1 << endl; } int main() { ios::sync_with_stdio(false); //加速cin和cout cin.tie(0); cout.tie(0);
cin >> n >> a >> b; for (int i = 1;i <= n;i++) { cin >> k[i]; } bfs(); return 0;
}
-
-4
#include <bits/stdc++.h> using namespace std; int n, a, b, k[205], f[205]; bool vis[205]; queue<int> q; void bfs() { f[1] = 0; q.push(a); vis[a] = true; while(!q.empty()) { int now = q.front(); q.pop(); int dy = now + k[now]; if (dy >= 1 && dy <= n && !vis[dy]) { f[dy] = f[now] + 1; q.push(dy); vis[dy] = true; } int ny = now - k[now]; if (ny >= 1 && ny <= n && !vis[ny]) { f[ny] = f[now] + 1; q.push(ny); vis[ny] = true; } if (now == b) { cout << f[b]; return; } } cout << -1; } int main() { cin >> n >>a >> b;
for (int i = 1;i <= n;i++)
{
cin >> k[i];
}
bfs();
return 0; }
-
-5
#include <bits/stdc++.h>
using namespace std;
int n, a, b, k[205], f[205];
bool vis[205];
queue<int> q;
void bfs()
{
f[1] = 0;
q.push(a);
vis[a] = true;
while(!q.empty())
{
int now = q.front();
q.pop(); int dy = now + k[now]; if (dy >= 1 && dy <= n && !vis[dy]) { f[dy] = f[now] + 1; q.push(dy); vis[dy] = true; } int ny = now - k[now]; if (ny >= 1 && ny <= n && !vis[ny]) { f[ny] = f[now] + 1; q.push(ny); vis[ny] = true; } if (now == b) { cout << f[b]; return; } } cout << -1; } int main() { cin >> n >> a >> b; for (int i = 1;i <= n;i++) { cin >> k[i]; } bfs(); return 0; }
- 1
信息
- ID
- 815
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 1
- 标签
- 递交数
- 96
- 已通过
- 69
- 上传者