C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++のバス路線


バス路線のリストがあるとします。各ルート[i]には、i番目のバスが永遠に繰り返されるバスルートがあります。したがって、routes [0] =[1、5、7]の場合、これは、最初のバス(0番目のインデックス)が1、5、7、1、5、7、1、...の順序で永久に移動することを意味します。 。

ここで、最初はバスではなくバス停Sから出発し、バス停Tに行きたいとします。目的地に到着するために必要なバスの数を最小限に抑える必要がありますか?これが不可能な場合は、-1を返します。

したがって、入力が[[1,2,8]、[3,6,8]]のようで、S =1、T =6の場合、出力は2になります。したがって、最初のバスでバス停7に行きます。次に、2番目のバスに乗ってバス停6まで行きます。

これを解決するには、次の手順に従います-

  • 1つのマップを定義するm
  • iを初期化する場合:=0、i
  • jを初期化する場合:=0、j
  • m [r [i、j]]の最後にiを挿入します
  • 1つのキューqを定義し、Sをqに挿入します
  • SがTと同じ場合、-
    • 0を返す
  • visitedと呼ばれる1つのセットを定義します
  • lvl:=1を初期化する場合、qが空でない場合は、更新(lvlを1増やします)し、-
      を実行します。
    • sz:=qのサイズ
    • szがゼロ以外の場合、-
        を実行します。
      • node:=qの最初の要素、qから要素を削除
      • iを初期化する場合:=0、i
      • route:=m [node、i]
      • ルートが訪問中の場合、-
        • 次の部分を無視し、次の反復にスキップします
      • 訪問先にルートを挿入
      • jを初期化する場合:=0、j
      • stop:=r [route、j]
      • 停止がTと同じ場合、-
        • リターンレベル
    • ストップをqに挿入
  • szを1つ減らします
  • 戻り値-1
  • 理解を深めるために、次の実装を見てみましょう-

    #include <bits/stdc++.h>
    using namespace std;
    class Solution {
    public:
       int numBusesToDestination(vector<vector<int>>& r, int S, int T) {
          unordered_map <int, vector <int> > m;
          for(int i = 0; i < r.size(); i++){
             for(int j = 0; j < r[i].size(); j++){
                m[r[i][j]].push_back(i);
             }
          }
          queue <int> q;
          q.push(S);
          if(S == T) return 0;
          unordered_set <int> visited;
          for(int lvl = 1; !q.empty(); lvl++){
             int sz = q.size();
             while(sz--){
                int node = q.front();
                q.pop();
                for(int i = 0; i < m[node].size(); i++){
                   int route = m[node][i];
                   if(visited.count(route)) continue;
                   visited.insert(route);
                   for(int j = 0; j < r[route].size(); j++){
                      int stop = r[route][j];
                      if(stop == T) return lvl;
                      q.push(stop);
                   }
                }
             }
          }
          return -1;
       }
    };
    main(){
       Solution ob;
       vector<vector<int>> v = {{1,2,8}, {3,6,8}};
       cout << (ob.numBusesToDestination(v, 1, 6));
    }

    入力

    {{1,2,8}, {3,6,8}}
    1
    6

    出力

    2

    1. C++でのリスのシミュレーション

      木、リス、そしていくつかのナッツがあります。位置は、2Dグリッドのセルで表されます。あなたの目標は、リスがすべてのナッツを集めて、それらを1つずつ木の下に置くための最小距離を見つけることです。リスは一度に最大で1つのナットしかとることができず、隣接するセルに向かって上下左右の4つの方向に移動できます。距離は移動回数で表されます。 したがって、入力が高さ:5幅:7木の位置:[2,2]リス:[4,4]ナッツ:[[3,0]、[2,5]]の場合、出力は12になります。 、 これを解決するには、次の手順に従います- 関数calc()を定義します。これには、x1、y1、x2、y2、が必要で

    2. C++の長方形エリアII

      (軸に沿った)長方形のリストがあるとします。ここで、各rectangle [i] ={x1、y1、x2、y2}です。ここで、(x1、y1)は左下隅のポイントであり、(x2、y2)は右上隅のポイントです。 i番目の長方形。 平面内のすべての長方形でカバーされる総面積を見つける必要があります。答えは非常に大きい可能性があるため、モジュロ10 ^ 9+7を使用できます。 したがって、入力が次のような場合 その場合、出力は6になります。 これを解決するには、次の手順に従います- m =10 ^ 9 + 7 関数add()を定義します。これには、a、b、が必要です。 r