2

基本的に、次のようなファイル内の単語の配列を見つけるという問題をほぼ解決しました。

aaaaaaaaaaaaaaaaaaaaa
setrsdfdsrrtdpyrinoeq
weraderelefantewwerrr
trtevhjujhaspescadito
rtxvfdghhgperrodrdvbh
ifghhfgaaasdserpiente
naendsdsadsasafrrsdft
nssdofgfgghghghdddddd
ttegatovvvfgfyhgggggg
rrrrrrrrrrrrrrrrrrrrr

他のファイルで見つかった座標を出力します。

ただし、縦方向の単語を検索する方法がわかりません。コードは行ごとに単語を検索し、見つかった場合はその座標を返します。

縦方向の単語を検索するために別の機能を実装する必要があることはわかっていますが、最善のアプローチは何でしょうか?

what_coor 関数を変更して垂直方向の単語を検索する方法は? たとえば、「ant」という単語を見つけることができます

aaaaaaaaaaaaaaaaa*a*aaa
bbbbbbbbbbbbbbbbb*n*bbb
rrrrrrrrrrrrrrrrr*t*rtr

コードは次のとおりです。

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>
#define MAX_OF_LINE 180 //max length of a line 

//search a word in a line if is there returns coordinate
int what_coor ( const char *line, const char *word ){
    const char *p, *x,*y;
    for ( p = line; *p != '\0'; p++ ) {
        x = p;
        y = word;
        for ( ; *x != '\0' && *y != '\0' && *x == *y; x++, y++ )
            ;
            if(*y == '\0')
                  return p - line + 1;
    }
    return -1;
}

//reservamos espacio para nuestro myArray 'bidimensional'
char **askMemory(int filas, int cols){
   char **myArray;
   int i;
   /* espacio para el myArray de apuntadores a entero*/
   myArray = (char**)malloc(filas * sizeof(char*));
   if(myArray == NULL){
      fprintf(stderr, "Error 1-d \n");
      exit(-1);
   }                                                                               
   /* espacio para los myArrays de letras */
   for(i = 0; i < filas; i++){
      myArray[i] = (char*)malloc(cols * sizeof(char));
      if(myArray[i] == NULL){
         fprintf(stderr, "Error 2-d\n");
         exit(-1);
      }
   }                                                                               
   return myArray;
}
//returns bidimensional array, filling it with a file
char **read (int *ptrNumWords, char *fileName) {
  char line[MAX_OF_LINE];   
  char **myArray;
  int i;
  FILE *f;
  if ( ! ( f = fopen (fileName, "r") ) ) {
    printf ("error opening %s\n", fileName);
    exit (-1);
  }
   while ( fgets (line, MAX_OF_LINE, f) ) {
         *ptrNumWords = *ptrNumWords+1;
  }
  myArray = askMemory (*ptrNumWords, MAX_OF_LINE);
  rewind (f);
  for ( i=0 ; i <*ptrNumWords ; i++ ) {
    fgets (myArray[i], MAX_OF_LINE, f);
    myArray[i][strlen(myArray[i])] = '\0';
  }
  fclose (f);
  return (myArray);
}

//seacrh word and writes output
void searchForIt(int rows, char **array2d , char *target){
     FILE *sal;
     sal = fopen("out.txt","a+");     
     int i, col;
     for ( i = 0; i < rows; i++ ) {
         col =  what_coor ( array2d[i], target );
         if( col != -1 ){
             fprintf(sal,"\"%s\" \t found on (%d,%d)\n",target, i+1, col);             
             printf ( "\"%s\" \t found on (%d,%d)\n", target, i+1, col );            
         }    
     }
      fclose(sal); 
}


int main (){
  int ptrNumWords = 0;
  int i=0;
  char **array2d;
  array2d  = read(&ptrNumWords, "in.txt"); 
  char *wordsBusca[] = {"gato", "perro", "raton", "elefante", "rino", "serpiente", "pescadito"};
  int len = sizeof(wordsBusca) / sizeof(char *) ;
  for(i =0; i< len; i++){
    searchForIt(ptrNumWords,array2d, wordsBusca[i] );
  }
  getch();
  return 0;
}
4

2 に答える 2

2

次のことができます。

概要:

ステップ 1: ファイルからデータを 2D マトリックスで読み取ります。行列の各要素は になりますchar
ステップ 2: 行列の転置を取ります。
ステップ 3: 関数を使用して水平方向に単語を検索しますmy_coor

詳細:
ステップ 1 を実行するには、1 行あたりの文字数と行数を取得し、2Dcharマトリックス スペースを動的に割り当てます。次に、文字ごとに読み取り、それぞれをマトリックスの正しい位置に保存し続けます。
ステップ 2 では、基本的な数学とスワッピングが必要です。
ステップ 3 はすでに実装済みです。

于 2013-10-15T04:35:40.513 に答える
1

別の質問への回答として、@ 0xF1の提案の変形を実装しました。私の解決策はこちらを参照してください。これで、実際に 10x10 マトリックスを 10x40 マトリックスに変換しました。マトリックス内の連続する行は、元の 10x10 の行に対応し、左から右、右から左、上から下、下から上に読み取られます。

このアプローチ (または単純な 10x20 - 左から右、上から下のみ) の利点は、高速検索に使用可能なすべての方向が得られることです。つまり、転置を行わずに各単語を 40 (または 20) 行に対して照合します。などなど。

有益な改善だと思います。

于 2013-10-15T04:54:41.487 に答える