我写了一个代码,它必须以两个字符串作为输入。它必须输出步数(相邻的字母翻转或翻转第一个和最后一个字母),需要一个字转换为另一个字。它给出正确的值,直到字符串的大小为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有关的问题。
它没有进入无限递归。最大输入字符串的长度有阶乘,我只在地图中找不到字符串时才插入字符串。
那么,你有没有通过调试器中的代码来查看异常发生的位置? – OldProgrammer 2014-10-27 18:30:25
你确定你有足够的RAM来处理8 nPr 8的递归深度吗?每次你调用'easyStrings'时,你都会使用越来越多的堆空间和你声明的所有新字符串。 – RPGillespie 2014-10-27 18:47:07