5 条题解

  • 3
    @ 2023-1-11 16:11:44

    这一题怎么没有题解?是太简单了?

    #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
      @ 2024-6-1 9:44:17

      这道题明显是一道广搜(BFS),核心思路就是求最短路程(当然也可以用深搜DFS,但是BFS的效率是要高于DFS的 在此之前我们先了解一下什么是广搜BFS

      广度优先搜索(Breadth-First Search,简称BFS)是一种遍历或搜索树或图的算法,它从一个节点开始,逐层遍历节点,直到找到目标节点或所有节点都被访问过为止。BFS常用于寻找最短路径、检测图的连通性等场景。

      BFS的主要特点和定义如下:

      1. 层次遍历:BFS从根节点(或任意节点)开始,逐层遍历节点,即先访问所有与起始节点相邻的节点,然后是这些节点的邻居,依此类推。
      2. 队列的使用:BFS使用队列作为其主要的数据结构。在搜索过程中,新发现的节点被添加到队列的末尾,而队列的前端节点则被取出进行处理。
      3. 访问标记:为了跟踪哪些节点已经被访问过,BFS通常使用一个访问标记数组(或集合),当节点从队列中取出时,会将其标记为已访问,以避免重复访问。
      4. 最短路径:在加权图中,BFS可以用于找到从起始节点到其他节点的最短路径(在无权图中,所有边的权重相同)。这是因为BFS按层次访问节点,所以它能够保证在找到目标节点时,所经过的路径是最短的。
      5. 时间复杂度:在最坏的情况下,BFS的时间复杂度为O(V+E),其中V是顶点数,E是边数。这是因为BFS可能会访问图中的每个顶点和每条边。
      6. 空间复杂度:BFS的空间复杂度也是O(V),因为需要存储访问标记数组和队列中的节点。
      7. 图的类型:BFS可以应用于有向图、无向图、加权图和无权图。但在有向图中,BFS只能找到从起始节点出发的最短路径,而不是到达起始节点的最短路径。
      8. 应用场景: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
        @ 2024-3-14 17:00:32

        #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
          @ 2023-8-8 17:18:38

          #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
            @ 2023-8-8 17:20:13

            #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
            上传者