Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boogle中的分段错误_C++_Recursion - Fatal编程技术网

C++ boogle中的分段错误

C++ boogle中的分段错误,c++,recursion,C++,Recursion,我正试图用暴力手段解决布谷问题。输入为: 网格矩阵,表示为字符串,例如:“pesa” 单词,也表示为字符串“asa” 我正在写一个函数来检查这个词是否是矩阵中的合法词 bool Boogle::contains(std::string grid, std::string word) const { bool* isvisited=new bool[grid.length()]; for (unsigned int i=0; i<grid.length(); i++)

我正试图用暴力手段解决布谷问题。输入为:

网格矩阵,表示为字符串,例如:“pesa” 单词,也表示为字符串“asa”

我正在写一个函数来检查这个词是否是矩阵中的合法词

bool Boogle::contains(std::string grid, std::string word) const
{
    bool* isvisited=new bool[grid.length()];
    for (unsigned int i=0; i<grid.length(); i++)
    {
        *(isvisited+i)=false;
    }

    for (unsigned int i=0; i<grid.length(); i++)
    {
        // Recursive approach
        if (grid[i]==word[0])
            if (checkqueue(grid, word, isvisited, i, 0))
                return true;    
    }
    return false;
}

bool Boogle::checkqueue(const string &grid, const string &word, bool* const &isvisited, unsigned int grid_index, unsigned int count) const
{   
    int matsize=int(sqrt(grid.length()));
    cout<<"\nCurrently at the index "<<grid_index<<"\n";
    isvisited[grid_index]=true;
    for (unsigned int i=0; i<grid.length(); i++)
    {
        cout <<isvisited[i]<<" ";
    }
    cout<<"\n";

    if (count==word.length()-1)
    {
        cout << " reach the end of word\n";
        return true;
    }
    else
    {
        count ++;
        cout << "Recursive call on WORD: "<<word<<"  " <<count<<" "<<word[count]<<"\n";

        // non diagonal
        if ((grid_index<grid.length()) && (isvisited[grid_index+1]==false) && (grid[grid_index+1]==word[count]))
            return checkqueue(grid, word, isvisited, grid_index+1, count);

        else if ((grid_index>0)&& (isvisited[grid_index-1]==false)  && (grid[grid_index-1]==word[count]))
            return checkqueue(grid, word, isvisited, grid_index-1, count);

        else if (((grid_index+matsize)<grid.length())&& (isvisited[grid_index+matsize]==false)  && (grid[grid_index+matsize]==word[count]))
            return checkqueue(grid, word, isvisited, grid_index+1, count);

        else if (((grid_index-matsize)<grid.length())&& (isvisited[grid_index-matsize]==false)  && (grid[grid_index-matsize]==word[count]))
            return checkqueue(grid, word, isvisited, grid_index+1, count);

        // diagonal
        else if ((grid_index-1-matsize>0)&& (isvisited[grid_index-1-matsize]==false)  && (grid[grid_index-1-matsize]==word[count]))
            return checkqueue(grid, word, isvisited, grid_index-1-matsize, count);

        else if ((grid_index+1-matsize>0) && (isvisited[grid_index+1-matsize]==false) && (grid[grid_index+1-matsize]==word[count]))
            return checkqueue(grid, word, isvisited, grid_index+1-matsize, count);

        else if ((grid_index+1+matsize<grid.length())&& (isvisited[grid_index+1+matsize]==false)  && (grid[grid_index+1+matsize]==word[count]))
            return checkqueue(grid, word, isvisited, grid_index+1+matsize, count);

        else if ((grid_index-1+matsize<grid.length())&& (isvisited[grid_index-1+matsize]==false)  && (grid[grid_index-1+matsize]==word[count]))
            return checkqueue(grid, word, isvisited, grid_index-1+matsize, count);
        else
        {
            // cout<<"No possible neighbor\n";
            return false;
        }

    }
}
p/S:当单词有效时(boogle.contains(“pesa”、“esp”))正确运行


您正在混合使用有符号和无符号算术
matsize
int
grid\u索引
unsigned int
。与
>0
的比较不起作用,因为结果总是无符号的,因此永远不会是负数


顺便说一句,在修复有符号/无符号不匹配后,您可能希望
>=0

您正在混合有符号和无符号算术
matsize
int
grid\u索引
unsigned int
。与
>0
的比较不起作用,因为结果总是无符号的,因此永远不会是负数


顺便说一句,在修复有符号/无符号不匹配后,您可能希望
>=0

您正在混合有符号和无符号算术
matsize
int
grid\u索引
unsigned int
。与
>0
的比较不起作用,因为结果总是无符号的,因此永远不会是负数


顺便说一句,在修复有符号/无符号不匹配后,您可能希望
>=0

您正在混合有符号和无符号算术
matsize
int
grid\u索引
unsigned int
。与
>0
的比较不起作用,因为结果总是无符号的,因此永远不会是负数



顺便说一句,在修复有符号/无符号不匹配后,您可能希望
>=0

如果您尝试显示
cout如果您尝试显示
cout如果您尝试显示
cout如果您尝试在g++上打开-Wall,它不会显示任何警告。我确实改成了unsigned,但没有帮助。问题是当它找不到下一个递归(没有有效的移动)时,它就有分段问题。我认为如果
=0
,就会出现警告,因为
(unsigned int)>=0
总是真的,所以它没有意义
(unsigned int)>0
如果为零,则可能为真,因此您没有收到警告。我在g++上打开了-Wall,它不会显示任何有关此的警告。我确实改成了unsigned,但没有帮助。问题是当它找不到下一个递归(没有有效的移动)时,它就有分段问题。我认为如果
=0
,就会出现警告,因为
(unsigned int)>=0
总是真的,所以它没有意义
(unsigned int)>0
如果为零,则可能为真,因此您没有收到警告。我在g++上打开了-Wall,它不会显示任何有关此的警告。我确实改成了unsigned,但没有帮助。问题是当它找不到下一个递归(没有有效的移动)时,它就有分段问题。我认为如果
=0
,就会出现警告,因为
(unsigned int)>=0
总是真的,所以它没有意义
(unsigned int)>0
如果为零,则可能为真,因此您没有收到警告。我在g++上打开了-Wall,它不会显示任何有关此的警告。我确实改成了unsigned,但没有帮助。问题是当它找不到下一个递归(没有有效的移动)时,它就有分段问题。我认为如果
=0
,就会出现警告,因为
(unsigned int)>=0
总是真的,所以它没有意义
(unsigned int)>0
如果为零,则可能为真,因此您没有收到警告。实际上,grid\u索引用于矩阵。变量计数用于单词,我这里有边界检查:网格_index@DzungNguyen好的,我花了时间仔细查看了您的代码,我的答案现在应该更合适;)非常感谢,我已经有一个星期的问题了!实际上,grid_索引是用于矩阵的。变量计数用于单词,我这里有边界检查:网格_index@DzungNguyen好的,我花了时间仔细查看了您的代码,我的答案现在应该更合适;)非常感谢,我已经有一个星期的问题了!实际上,grid_索引是用于矩阵的。变量计数用于单词,我这里有边界检查:网格_index@DzungNguyen好的,我花了时间仔细查看了您的代码,我的答案现在应该更合适;)非常感谢,我已经有一个星期的问题了!实际上,grid_索引是用于矩阵的。变量计数用于单词,我这里有边界检查:网格_index@DzungNguyen好的,我花了时间仔细查看了您的代码,我的答案现在应该更合适;)非常感谢,我已经有一个星期的问题了!
./Boogle.exe 
.
Currently at the index 3
0 0 0 1 
Recursive call on WORD: asa  1 s

Currently at the index 2
0 0 1 1 
Recursive call on WORD: asa  2 a
Segmentation fault: 11
Currently at the index 1
0 1 0 0 
Recursive call on WORD: esp  1 s

Currently at the index 2
0 1 1 0 
Recursive call on WORD: esp  2 p

Currently at the index 3
0 1 1 1 
 reach the end of word



OK (1 tests)
bool Boogle::checkqueue(const string &grid, const string &word, bool* const &isvisited, int grid_index, unsigned int count) const