mirror of
https://github.com/TheAlgorithms/C.git
synced 2026-04-23 22:09:37 +00:00
61 lines
1.8 KiB
C
61 lines
1.8 KiB
C
int getPointKey(int i, int j, int boardSize, int boardColSize){
|
|
return boardSize * boardColSize * i + j;
|
|
}
|
|
|
|
const int directionsSize = 4;
|
|
const int directions[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
|
|
|
|
bool exitsWord(int i, int j, char** board, int boardSize, int* boardColSize, int wordIndex, char* word, int* vistedPointSet){
|
|
if (board[i][j] != word[wordIndex]){
|
|
return false;
|
|
}
|
|
|
|
if (wordIndex == strlen(word) - 1){
|
|
return true;
|
|
}
|
|
|
|
for (int k = 0; k < directionsSize; k++){
|
|
int nextI = i + directions[k][0];
|
|
int nextJ = j + directions[k][1];
|
|
|
|
if (nextI < 0 || nextI >= boardSize || nextJ < 0 || nextJ >= boardColSize[i]){
|
|
continue;
|
|
}
|
|
|
|
int key = getPointKey(nextI, nextJ, boardSize, boardColSize[i]);
|
|
if (vistedPointSet[key] == 1){
|
|
continue;
|
|
}
|
|
|
|
vistedPointSet[key] = 1;
|
|
if (exitsWord(nextI, nextJ, board, boardSize, boardColSize, wordIndex + 1, word, vistedPointSet)){
|
|
return true;
|
|
}
|
|
|
|
vistedPointSet[key] = 0;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
// Use backtracking.
|
|
// Runtime: Runtime: O(n*m*4^len(word))
|
|
bool exist(char** board, int boardSize, int* boardColSize, char* word){
|
|
int* vistedPointSet = (int*) calloc(getPointKey(boardSize, boardColSize[0], boardSize, boardColSize[0]), sizeof(int));
|
|
|
|
for (int i = 0; i < boardSize; i++){
|
|
for (int j = 0; j < boardColSize[i]; j++){
|
|
int key = getPointKey(i, j, boardSize, boardColSize[i]);
|
|
vistedPointSet[key] = 1;
|
|
if (exitsWord(i, j, board, boardSize, boardColSize, 0, word, vistedPointSet)){
|
|
return true;
|
|
};
|
|
|
|
vistedPointSet[key] = 0;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|