2013-02-14 4 views
0

Мне нужно найти повторяющиеся элементы в двухмерном массиве.Найти дублирующие элементы в двумерном массиве

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; 

Это мои данные; необходимо найти повторяющиеся записи маршрута [2] [1] (дубликат маршрута [0] [2]) и маршрут [4] [1] (дубликат маршрута [1] [1]).

Решение представляет собой дублирующее значение «i» маршрута [i] [j], которое равно 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 

Так что я значения [2 и 4] дублированные, и это мой ожидаемый результат моего кода.

+2

маршрут [2] [1] является 18 и маршрутом [4] [1] 25. Что делает их дубликаты? –

+0

маршрут [2] [1] дублируется для маршрута [0] [2], а маршрут [4] [1] является дубликатом для маршрута [1] [1] –

+0

Предполагаю, что исходные индексы должны быть сохранены – WhozCraig

ответ

1

Есть что-то против нуля индекса, ноль?

Я также не вижу смысла указателя shenanigans.

Это абсолютно безопасная вещь для инициализации всех ваших данных. Вы знаете, к нулю или к чему-то.

Алгоритм, который вы предлагаете в своем решении, довольно трудно быть верным, но это найдет ваши дубликаты. Вы должны пройти через весь массив в двух измерениях дважды.

Это также будет соответствовать всем нулям в ваших данных, поэтому вы можете добавить исключение, чтобы игнорировать значения маршрутов, равные нулю.

//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); 
      } 
     } 
    } 
} 

Итак, если вы хотите только увидеть матчи один раз, то есть [0] [2] == [2] [1], но не [2] [1] == [0] [2] , то вы можете сделать что-то вроде того, что у меня внизу. Это заставило меня почесать голову. Обычно, когда это простой список элементов, вы инициализируете внутренний цикл значением внешнего цикла, плюс один. Но вы не можете это сделать, когда это 2D-массив. Поэтому я сдался и сделал супер-хромую работу. Я большой поклонник грубого форсинга, когда это возможно. Обычно я говорю вам не использовать такие указатели.

Теперь ... это все равно будет иметь несколько обращений, если у вас есть три одинаковых значения. Если это вас раздражает, вам нужно начать сбор списка и сравнить хиты с ним при прохождении данных.

#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]); 

     } 
    } 
    } 
} 
+0

спасибо, его –

+0

У вас есть соответствие [0] [2] = [2] [1] У вас есть соответствие [1] [1] = [4] [1] У вас есть совпадение [2] [1] = [0] [2] У вас есть совпадение [4] [1] = [1] [1], это мои выходы, на самом деле, почему есть повторение, и я не мог управлять этим –

+0

Хмммм. Если вы не хотите видеть совпадение в другом направлении, я бы обычно инициализировал внутренний цикл до 'i + 1', но это сложнее с 2D-массивом ... – Philip

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); 
       } 
     }  


    } 
+0

@philip У вас есть матч [0] [2] = [2] [1] У вас есть матч [1] [1] = [4] [1] У вас есть матч [2] [1] = [0] [2] У вас есть совпадение [4] [1] = [1] [1] Это мои выходы, на самом деле, почему есть повтор, и я не мог контролировать это –