Keresés 2D mátrixban

 ( eriktoth | 2012. november 30., péntek - 21:33 )

Üdv!
Van egy komplett kódom, a probléma a következő, egy 2D-s charakterekből álló mátrixban kéne megtalálnom egy szót, az ötletem az volt hogy megkeresem a szó elejét és megnézem mindegyik irányt, sajnos állandóan azt adja vissza, hogy nem talált semmit és nem tudom mért :S
Segítséget előre is köszönöm

#include 
#include 
#include 
#include 
#include 

#define START 0
#define TRUE 1
#define FALSE 0
 

typedef struct matrix{
int sorok;
int oszlopok;
char **matrix;
}TMatrix;

typedef struct vector{
int darab;
char **szavak;
}Tvektor;
 
 
int szobeolvas(Tvektor *vektor){
  FILE *cteni;
  int i=0;
  
  cteni = fopen("szavak.txt","r");
  
  vektor->szavak=malloc(sizeof(char*)*100);
  
  vektor->szavak[i]=malloc(sizeof(char)*100);
 
  
 fscanf(cteni,"%s",vektor->szavak[i]);
 printf("%s\n",vektor->szavak[i]);
 
  vektor->darab = strlen(*vektor->szavak);
  
      printf("%d\n",(vektor->darab));


  return 0;
}

 
int matrixbeolvas(TMatrix *m){
      
  FILE* fInput;
fInput=fopen("matrix.txt","r");


fscanf(fInput,"%d %d",&m->sorok,&m->oszlopok);


m->matrix=malloc(m->sorok * sizeof(int*));
if (m->matrix==NULL) exit(-2);
 
for (int i=0;isorok;i++){
    m->matrix[i]=malloc(m->oszlopok * sizeof(int));
    if (m->matrix[i]==NULL) exit(-2);
}

for (int i=0;isorok;i++)
    for (int j=0;joszlopok;j++){
        fscanf(fInput,"%s",&m->matrix[i][j]);
    }
fclose(fInput);

return 0;
}

void printmatrix(TMatrix m){
    
  printf("%d %d\n",m.sorok,m.oszlopok);
  for (int i=0;isorok; x++) { // sorokot  nezzuk
    for(y = 0; y < m->oszlopok; y++) { //  oszlopokat nezuk
      if(m->matrix[indexek(x, y, *m)] == vektor->szavak[START]) { // ha megegyezik az elso elemmel kezdunk keresni
 
          // az egyses ciklusok bizonyos iranzakat neznek at addig meg nem egyezik
          for(darab = 1; darab < vektor->darab; darab++) {
            if(x - darab >= 0) { // pohyb na sever
              if(m->matrix[indexek((x - darab), y, *m)] == vektor->szavak[darab]) {
                allapot = TRUE;
                if(darab + 1 == vektor->darab)
                  vege = TRUE; // ha egyezik akkor igazat adunk vissza
              } else {
                allapot = FALSE;
                break;
              }
            } else {
              break;
            }
          }
 
          for(darab = 1; darab < vektor->darab; darab++) {
            if(x - darab >= 0 && y + darab < m->oszlopok && vege == FALSE) { // kereses eszaknygatra
              if(m->matrix[indexek((x - darab), (y + darab), *m)] == vektor->szavak[darab]) {
                allapot = TRUE;
                if(darab + 1 == vektor->darab)
                  vege = TRUE;
              } else {
                allapot = FALSE;
                break;
              }
            } else {
              break;
            }
          }
 
          for(darab = 1; darab < vektor->darab; darab++) {
            if(y + darab < m->oszlopok && vege == FALSE) { // nyugat
              if(m->matrix[indexek(x, (y + darab), *m)] == vektor->szavak[darab]) {
                allapot = TRUE;
                if(darab + 1 == vektor->darab)
                  vege = TRUE;
              } else {
                allapot = FALSE;
                break;
              }
            } else {
              break;
            }
          }
 
          for(darab = 1; darab < vektor->darab; darab++) {
            if(x + darab < m->sorok && y + darab < m->oszlopok && vege == FALSE) { // delnyugat
              if(m->matrix[indexek((x + darab), (y + darab), *m)] == vektor->szavak[darab]) {
                allapot = TRUE;
                if(darab + 1 == vektor->darab)
                  vege = TRUE;
              } else {
                allapot = FALSE;
                break;
              }
            } else {
              break;
            }
          }
 
          for(darab = 1; darab < vektor->darab; darab++) {
            if(x + darab < m->sorok && vege == FALSE) { //del
              if(m->matrix[indexek((x + darab), y, *m)] == vektor->szavak[darab]) {
                allapot = TRUE;
                if(darab + 1 == vektor->darab)
                  vege = TRUE;
              } else {
                allapot = FALSE;
                break;
              }
            } else {
              break;
            }
          }
 
          for(darab = 1; darab < vektor->darab; darab++) {
            if(x + darab < m->sorok && y - darab >= 0 && vege == FALSE) { // delnyugat
              if(m->matrix[indexek((x + darab), (y - darab), *m)] == vektor->szavak[darab]) {
                allapot = TRUE;
                if(darab + 1 == vektor->darab)
                  vege = TRUE;
              } else {
                allapot = FALSE;
                break;
              }
            } else {
              break;
            }
          }
 
          for(darab = 1; darab < vektor->darab; darab++) {
            if(y - darab >= 0 && vege == FALSE) { // nyugat
              if(m->matrix[indexek(x , (y - darab), *m)] == vektor->szavak[darab]) {
                allapot = TRUE;
                if(darab + 1 == vektor->darab)
                  vege = TRUE;
              } else {
                allapot = FALSE;
                break;
              }
            } else {
              break;
            }
          }
 
          for(darab = 1; darab < vektor->darab; darab++) {
            if(x - darab >= 0 && y - darab >= 0 && vege == FALSE) { // ;eszaknyugat
              if(m->matrix[indexek((x - darab) , (y - darab), *m)] == vektor->szavak[darab]) {
                allapot = TRUE;
                if(darab + 1 == vektor->darab)
                  vege = TRUE;
              } else {
                allapot = FALSE;
                break;
              }
            } else {
              break;
            }
          }
 
 
        if(vektor->darab == 1) { // ha csak egy eleme van igazat adunk vissza
          return TRUE;
        }
 
        if(vege == TRUE && allapot == TRUE) {
          return TRUE;
        } else {
          allapot = FALSE;
        }
      }
    }
  }
  printf("%d\n",allapot);
  return allapot;
}
 




int main(){
   Tvektor v;
   TMatrix m;
   matrixbeolvas(&m);
   szobeolvas(&v);
   search(&v,&m); 
  return 0;
}

A kód többi része teljesen működőképes, igen tudom, hogy malloc-nál es fopen-nél kellene ellenőrizni..

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

"A kód többi része teljesen működőképes, ..."

Ne érts félre, nem a rossz szándék vezérel, de ez a kód gyanúsan NEM működőképes.
Csak néhány probléma, amiket szerintem először kezelni kellene, hogy utána lehessen az algoritmus javítására fókuszálni:

- Ha van rá lehetőség, hagyd el a C-t, C++-ban könnyebb kódolni, főleg kezdőknek.
- Használj CamelCase vagy más hasonló konvenciót a változó- és függvénynevekhez!
Én személy szerint az angol változó elnevezéseket preferálom, de ha a magyarnál maradsz, akkor is kerüld el a cteni és egyéb
olvashatatlan elnevezéseket!
- Az isorok változó egyáltalán definiálva van valahol? Ugye nem egy másik fájlban van deklarálva, amit az include-dal hívsz be?
- Egyáltalán nem látok search függvényt...
- Ellenben a printmatrix függvény csinálna valami hasonlót, de az meg nem vár vektort paraméterként, pluszban a TMatrix paramétert is érték szerint kapja meg, és nem cím szerint.
- A matrixbeolvas és a vektorbeolvas függvények teljesen rosszak (és most nem arra gondolok, hogy fclose előtt van egy return utasítás is ... ), hanem pl. az i ciklusváltozóhoz nem tartozik ciklus ...

Van még pár dolog, de egyelőre szerintem ennyi is elég.

Ha tényleg működő kódot szeretnél, jelezd, melyik részében segítsünk. A matrix es vektor beolvasas pl. egy jó kiinduló feladat lenne, mert ha azok nem mennek, akkor az algoritmusnak nem lesz inputja, amin dolgozzon.

De ha nem akarsz szenvedni a beolvasassal, hasznalj egy - a forraskodban létrehozott - adattal feltöltött mátrixot és vektort, és azon lehetne fejleszteni a kereső algoritmust.

azt hiszem valahova bemasolom akodot, mert egy csomo dolgot nem jelenit meg ami ott van :S

http://pastebin.com/05s7YJjd

Remélem így jobban átlátható, ki írja a mátrixomat gond nélkül, a szót elmenti a sturkturába, de egyszerűen a keresés ami nem megy

Figyelj, te hogyan is vizsgálod, hogy két szó egyezik?

a for ciklusokban, keresem a legközelebbi egyező karaktereket, de lehet valami oltári baromságot csináltam

Csak gyorsan átfutva nekem is gyanús. Mit tárolsz egy adott [i][j] pontban, mire végzed az egyezést?
(direkt nem is nézek kódot, mondd el magadtól az algoritmust, hogy magad találd meg a hibát, az célravezetőbb)

Nekem kicsit házi feladat gyanús a téma.

És?
Nem kész megoldást vár egy kódsor megírása nélkül.

Igen, de innentől kezdve az "állj át c++-ra/javara, stb." tanácsok, amik kb. harmadik kommentben elő szoktak jönni nem alkalmazhatóak.