0

2次元配列で重複する要素を見つける必要があります。

route_ptr->route[0][1] = 24;
route_ptr->route[0][2] = 18;
route_ptr->route[1][1] = 25;
route_ptr->route[2][1] = 18;
route_ptr->route[3][1] = 26;
route_ptr->route[3][2] = 19;
route_ptr->route[4][1] = 25;
route_ptr->route[4][2] = 84;

これらは私のデータです。route [2] [1](route [0] [2]の重複)とroute [4] [1](route [1] [1]の重複)の重複エントリを見つける必要があります。

解決策は、route[i][j]の重複した「i」値です。これはこの例の2と4です。

案内してください。

#include <stdio.h>

struct route{
    int route[6][6];
    int no_routes_found;
    int count_each_route[6];
};

int main() {
    struct route *route_ptr, route_store;  
    route_ptr=&route_store;

    int i,j,k;

    // the data
    route_ptr->route[0][1] = 24;
    route_ptr->route[0][2] = 18;
    route_ptr->route[1][1] = 25;
    route_ptr->route[2][1] = 18;
    route_ptr->route[3][1] = 26;
    route_ptr->route[3][2] = 19;
    route_ptr->route[4][1] = 25;
    route_ptr->route[4][2] = 84;
    route_ptr->count_each_route[0]=3;
    route_ptr->count_each_route[1]=2;
    route_ptr->count_each_route[2]=2;
    route_ptr->count_each_route[3]=3;
    route_ptr->count_each_route[4]=3;
    route_ptr->no_routes_found=5;

    ////  process
    for (i = 0; i <(route_ptr->no_routes_found) ; i++)
    {
        for (j = 1; j < route_ptr->count_each_route[i]; j++)
        {
            printf("\nroute[%d][%d] = ", i, j);
            printf("%d",route_ptr->route[i][j]);
        }
    }
}

期待される解決策は次のとおりです。

route[0][1] is compared by route [0][2] i.e [24 !=18]
route[0][1] and route [0][2] is compared by route[1][1] i.e [24 && 18 !=25]
route[0][1] and route[0][2] and route[1][1] is compared by route[2][1] i.e [ 24&&18&&25 is compared by 18, there is a matching element,
   save the newcomer 'i' value which matches to the existence and drop it for next checking]
   break the 'i' loop
route[0][1], route[0][2], route[1][1] is now compared route[3][1]
route[0][1], route[0][2], route[1][1] ,[3][1] is now compared route[3][2]
route[0][1], route[0][2], route[1][1] ,[3][1] ,[3][2] is now compared to route [4][1] i.e [ now there is a match to route[1][1], so save the newcomer 'i' value and  break the 'i' loop

したがって、iの値[2と4]は重複しており、これが私のコードの期待される結果です。

4

2 に答える 2

1

インデックスゼロ、ゼロに対して何かを得ましたか?

私はまた、ポインターのシェナニガンの要点もわかりません。

すべてのデータを初期化することは一般的な安全策です。あなたが知っている、ゼロか何かに。

ソリューションで提案するアルゴリズムを忠実に再現するのはかなり難しいですが、これにより重複が見つかります。アレイ全体を両方の次元で2回ウォークスルーする必要があります。

これはデータ内のすべてのゼロにも一致するため、ゼロのルート値を無視する例外を追加できます。

//Cycling through the array the first time.
for (i = 0; i < 6 ; i++)
{
    for (j = 0; j < 6; j++)
    {
        //Cycling through the array the second time
        for (x = 0; x < 6 ; x++)
        {
            for (y = 0; y < 6; y++)
            {
               if(i==x && j==y)
                   continue;
               if(routestore.route[i][j] == routestore.route[x][y])
                   printf("You have a match [%d][%d] =  [%d][%d]", i, j, x,y);
            }
        }
    }
}

さて、一致を1回だけ表示したい場合、つまり[0] [2] == [2] [1]で、[2] [1] == [0] [2]は表示したくない場合は、次のようにすることができます。私が下に持っているもの。これで頭をかいてしまいました。通常、アイテムの単純なリストの場合、内側のループを外側のループの値に1を加えた値に初期化します。しかし、それが2D配列の場合、それを完全に行うことはできません。それで私はあきらめて、スーパーラメのハックジョブを作りました。私は可能な限りブルートフォース攻撃の大ファンです。私は通常、このようなポインタを使用しないように指示します。

さて...3つの類似した値がある場合、これはまだ複数のヒットがあります。それが気になる場合は、データをウォークスルーしながら、リストの作成とヒットの比較を開始する必要があります。

#include <stdio.h>
#include <string.h>

struct route{
    int route[6][6];
    int no_routes_found;
    int count_each_route[6];
};

int lameAddOneAlternative(int *i, int *j)
{
  if((*j)<6)
  {
    (*j)++;
    return 1;
  }
  else if (*i<6)
  {
    (*i)++;
    (*j) = 0;
    return 1;
  }  
  return 0;
}

int main(int argc, char **argv)
{
  struct route routeStore;  
  int i,j,x,y;

  memset(routeStore.route,0,sizeof(int)*36);

  // the data
  routeStore.route[0][1] = 24;
  routeStore.route[0][2] = 18;
  routeStore.route[1][1] = 25;
  routeStore.route[2][1] = 18;
  routeStore.route[3][1] = 26;
  routeStore.route[3][2] = 19;
  routeStore.route[4][1] = 25;
  routeStore.route[4][2] = 84;

  //Cycling through the array the first time.
  for (i = 0; i < 6 ; i++)
  {
    for (j = 0; j < 6; j++)
    {
      x=i;
      y=j;
      //Cycling through the array the second time
      while(lameAddOneAlternative(&x,&y))
      {
        if(routeStore.route[i][j] == 0 )
          continue;
        if(routeStore.route[i][j] == routeStore.route[x][y])
          printf("You have a match [%d][%d], [%d][%d] == %d\n", i, j, x,y, routeStore.route[i][j] );

      }
    }
  }
}
于 2013-02-14T16:32:59.373 に答える
0
for (i = 0; i <(route_ptr->no_routes_found) ; i++)
{
     for (j = 1; j < route_ptr-> count_each_route[i]; j++)
     {          
          for (x = 0; x < (route_ptr->no_routes_found) ; x++)
          {
               for (y = 0; y < route_ptr-> count_each_route[x]; y++)
               {
                  if(i==x && j==y)
                  continue;
                  if(route_ptr->route[i][j] == route_ptr->route[x][y])
                  printf("You have a match [%d][%d] =  [%d][%d]\n", i, j, x,y);
              }
         }     


    }
于 2013-02-14T19:43:50.673 に答える