Witam mam problem ze znalezieniem wzorca w tablicy dwuwymiarowej, ponieważ program zawiesza się przy szukaniu wzorca i nie wiem jak za bardzo naprawić ten błąd. Jeśli ktoś wie to niech napisze, co i jak zmienić. Z góry dzięki
#include <cstdlib>
#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
#include <vector>
using namespace std;
int porownaj(string p, char** t, int lok1, int lok2, int max_wiersz)
{
int m=p.length();
int j=0;
int war=0;
int maxw;
maxw=max_wiersz;
while ( j<m && t[max_wiersz % (lok1+j)][lok2] == p[j] )
{
if (war==0 && j+lok1>maxw)
{
war++;
lok2++;
maxw+=maxw;
}
if (war==1 && j>maxw)
{
lok2++;
maxw+=maxw;
}
j++;
}
if (j == m)
{
return 1;
}
else
{
return 0;
}
}
void szukaj (string p, char** t, int dl_w, int il_w, int n)
{
int m=p.length();
int i=0;
int ile=1;
int miejsce=0;
int dwiersz=0;
dwiersz=dl_w;
while (i <= (n-m) )
{
if (porownaj(p,t,miejsce, ile, dl_w) == 1)
{
miejsce=((i+1) % dl_w);
cout << "Wzorzec na miejscu : " << miejsce << "i wierszu nr " <<ile << endl;
}
if (i>dwiersz)
{
ile++;
dwiersz+=dwiersz;
}
i++;
}
}
vector<int> MP(string &p)
{
vector<int> Pi(p.length()+1); //m¹drzejsza tablica
Pi[0]=-1;
int i=0;
int j=-1;
int n=p.length();
while ( i <= n )
{
while ( j > -1 && p[i] != p[j] )
{
j=Pi[j];
}
i++;
j++;
Pi[i] = j;
}
return Pi; //PI
}
vector<int> KMP(string &p) //¿eby nie kopiowaæ, a tylko wy³uskaæ wartoœæ
{
vector<int> Pi_(p.length()+1); //m¹drzejsza tablica
Pi_[0]=-1;
int i=0;
int j=-1;
int n=p.length();
while ( i <= n )
{
while ( j > -1 && p[i] != p[j] )
{
j=Pi_[j];
}
i++;
j++;
if ( p[i] == p[j] )
{
Pi_[i] = Pi_[j];
}
else
{
Pi_[i] = j;
}
}
return Pi_; //Tablica PI'
}
int main(int argc, char *argv[])
{
srand(time(NULL));
int n=1;
int licznik=0;
int dl_wiersz=0;
int ilosc_wiersz=0;
string P;
cout << "Podaj dlugosc ciagu: ";
cin >> n;
cout << endl;
cout<<"\nPodaj dlugosc wiersza: ";
cin >> dl_wiersz;
if(n % dl_wiersz==0)
ilosc_wiersz=n/dl_wiersz;
else
ilosc_wiersz=(n/dl_wiersz)+1;
char** T;
T=new char*[dl_wiersz];
for (int i=0;i<dl_wiersz;i++)
T[i]=new char[ilosc_wiersz];
for (int j=0; j<ilosc_wiersz; j++)
{
for (int i=0; i<dl_wiersz; i++)
{
T[i][j]= char ( 'a' + rand() % 5 );
licznik++;
if (licznik>n)
T[i][j]='\0';
}
}
licznik=0;
cout << endl;
for (int j=0; j<ilosc_wiersz ; j++)
{
for (int i=0; i<dl_wiersz; i++)
cout<< T[i][j];
cout<<"\n";
}
cout << endl;
cout << "Podaj wzorzec: ";
cin >> P;
cout << endl;
char znak[5];
char znak1[5];
string ww;
znak[0]='k';
znak[1]='l';
znak[2]='u';
znak[3]='c';
znak[4]='z';
znak[5]='\0';
ww="klucz";
znak1[0]='k';
znak1[1]='l';
znak1[2]='u';
znak1[3]='c';
znak1[4]='z';
znak1[5]='\0';
for (int a=0; a<5; a++)
{
cout<<ww[a];
}
cout<<"\n"<<endl;
for (int a=0; a<5; a++)
{
if (ww[a]==znak1[a])
{
cout<<"spoko\n";
}
cout<<"nie pasuje\n\n";
break;
}
szukaj(P,T,dl_wiersz, ilosc_wiersz, n);
cout << endl;
/*
//MORRIS-PRATT
////////////////////////////////////////////////////////////////////////////
vector<int> tmp(P.length()+1);
tmp=MP(P);
cout << "===============MORRIS PRATT===============" << endl;
for (int i=0; i<=P.length() ; i++)
{
cout << tmp[i] << " ";
}
cout << endl;
////////////////////////////////////////////////////////////////////////////
//KNUTH-MORRIS-PRATT
////////////////////////////////////////////////////////////////////////////
tmp=KMP(P);
cout << "=============KNUTH MORRIS PRATT===============" << endl;
for (int i=0; i<=P.length() ; i++)
{
cout << tmp[i] << " ";
}
cout << endl;
////////////////////////////////////////////////////////////////////////////
*/
system("PAUSE");
return 0;
}