Я написал код, который должен принимать две строки в качестве входных данных. Он должен вывести количество шагов (переворачивание соседних букв или переворачивание первой и последней буквы), для преобразования одного слова в другое требуется одно слово. Он дает правильные значения до тех пор, пока размер строки не будет равен 8. Если размер строки больше 8, это дает ошибку сегментации. Я не мог найти ни одной ошибки. Может кто-нибудь, пожалуйста, помогите мне. Заранее спасибо. Это код:
map<string,int>imap;
int easyStrings(string a, string b) {
//cout<<a<<endl;
if(a.compare(b) == 0)
return 0;
map<string,int>::iterator it = imap.find(a);
if(it != imap.end())
return it->second;
imap.insert(pair<string,int>(a,-2));
int min = -2;
string str = a;
str[0] = a[a.length()-1];
str[a.length()-1] = a[0];
it = imap.find(str);
if(it == imap.end() || it->second != -2)
min = 1 + easyStrings(str,b);
for(int i = 0 ; i < a.length()-1; i++)
{
string check = a;
check[i] = a[i+1];
check[i+1] = a[i];
int steps = 0;
it = imap.find(check);
if(it == imap.end() || it->second != -2)
{
steps = 1 + easyStrings(check,b);
if(steps < min || min ==-2)
if(steps > 0)
min = steps;
}
}
imap[a] = min;
return min;
}
Пробовал использовать отладчик. Я показываю ошибку в imap.insert(pair(a,-2));. Это также дает огромную трассировку, показывающую проблемы, в основном с malloc.
Он не переходит в бесконечную рекурсию. Максимально существует факториал длины входной строки, и я вставляю строку только тогда, когда она не найдена на карте.