나는 무차별 접근법에서의 문제를 푸는 중이다. 입력은 다음과 같습니다.구글의 세분화 오류
문자열로 표시되는 격자 행렬입니다 (예 : '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;
}
}
}
나는 boogle.contains ("pesa", "as")를 실행하면 멋지게 작동합니다. 그러나 "asa"와 같이 불법적 인 단어 인 경우 세그먼테이션 오류가 반환됩니다. 그게 어디서 온거야?
./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
P/s의 : 단어가 유효 할 때 올바른 실행 ("ESP"boogle.contains ("PESA"))
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)
사실 grid_index는 행렬에 대한 것입니다. 변수 수는 단어에 대한 것이고 나는 여기에서 경계를 확인합니다 : grid_index
@DzungNguyen 그래, 시간이 걸렸고 코드를주의 깊게 살펴 보았으니 지금 내 대답이 더 적합해야한다;) – Masadow
감사합니다. 많이, 나는 일주일 동안이 버그에 문제가있었습니다! –