2014-10-27 71 views
0

我写了一个代码,它必须以两个字符串作为输入。它必须输出步数(相邻的字母翻转或翻转第一个和最后一个字母),需要一个字转换为另一个字。它给出正确的值,直到字符串的大小为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有关的问题。

它没有进入无限递归。最大输入字符串的长度有阶乘,我只在地图中找不到字符串时才插入字符串。

+2

那么,你有没有通过调试器中的代码来查看异常发生的位置? – OldProgrammer 2014-10-27 18:30:25

+0

你确定你有足够的RAM来处理8 nPr 8的递归深度吗?每次你调用'easyStrings'时,你都会使用越来越多的堆空间和你声明的所有新字符串。 – RPGillespie 2014-10-27 18:47:07

回答

0

用gdb粗略浏览一下这个函数就会发现这个函数是递归的,而且超过一定长度的字符串会触发它进入无限深度的递归(或者至少是一个4G内存无法处理的深度) 。我会看你的递归条件,并仔细检查是否有一个退出的情况下,将满足所有的人。

+0

它没有进入无限循环,但我觉得没有足够的内存分配是唯一可能的原因。谢谢。 – user3453575 2014-10-27 19:01:55