从某个元素继续迭代二维数组
Continue iterating a 2D array from certain element
我正在创建一个单词搜索游戏,但我被算法困住了。我需要在类似 table 的数据结构中找到单词的出现。我选择使用我知道长度和高度的二维数组。我的想法是寻找单词的第一个字母,如果找到则向所有可能的方向寻找。我无法掌握的是找到第一个字母后如何开始搜索。我想将第一个字母的位置传递给将在所有方向上搜索的方法。这是我目前所拥有的:
public void SearchWord(char[,] input, string name)
{
//1. loop through the array and look for the first letter of the string
//2. if found search in all directions "iterative"
//3. if one direction doesn't find it break out of the method and continue to search in other directions
//4. if found mark the positions so you don't find the same word more than once
char firstLetter = name[0];
//go look for it in the 2d array
for (int y = 0; y < 5; y++)
{
for (int x = 0; x < 4; x++)
{
if (results[x, y] == firstLetter)//found the letter
{
Console.WriteLine("Found it " + " " + firstLetter);
Console.WriteLine(x + " " + y);
SearchRightDirection(x, y);
SearchLeftDirection(x, y);
}
}
}
}
我尝试将位置作为参数传递,例如 SearchRightDirection(char[], int x, int y){} 但是我无法从这个确切的位置行和列数组继续。
你有什么建议吗?另外结构是否正确?
给你:
public static class Sample
{
public static int CountOccurrences(char[,] table, string word)
{
if (string.IsNullOrEmpty(word)) return 0;
int count = 0;
int rowCount = table.GetLength(0);
int colCount = table.GetLength(1);
for (int row = 0; row < rowCount; row++)
{
for (int col = 0; col < colCount; col++)
{
if (table[row, col] != word[0]) continue;
if (word.Length == 1) { count++; continue; }
for (int dy = -1; dy <= 1; dy++)
for (int dx = -1; dx <= 1; dx++)
if ((dx != 0 || dy != 0) && Match(word, table, rowCount, colCount, row, col, dy, dx)) count++;
}
}
return count;
}
private static bool Match(string word, char[,] table, int rowCount, int colCount, int startRow, int startCol, int dy, int dx)
{
int row = startRow + dy;
if (dy != 0 && (dy < 0 ? row : rowCount - row) < word.Length - 1) return false;
int col = startCol + dx;
if (dx != 0 && (dx < 0 ? col : colCount - col) < word.Length - 1) return false;
for (int charPos = 1; charPos < word.Length; row += dy, col += dx, charPos++)
if (table[row, col] != word[charPos]) return false;
return true;
}
}
我正在创建一个单词搜索游戏,但我被算法困住了。我需要在类似 table 的数据结构中找到单词的出现。我选择使用我知道长度和高度的二维数组。我的想法是寻找单词的第一个字母,如果找到则向所有可能的方向寻找。我无法掌握的是找到第一个字母后如何开始搜索。我想将第一个字母的位置传递给将在所有方向上搜索的方法。这是我目前所拥有的:
public void SearchWord(char[,] input, string name)
{
//1. loop through the array and look for the first letter of the string
//2. if found search in all directions "iterative"
//3. if one direction doesn't find it break out of the method and continue to search in other directions
//4. if found mark the positions so you don't find the same word more than once
char firstLetter = name[0];
//go look for it in the 2d array
for (int y = 0; y < 5; y++)
{
for (int x = 0; x < 4; x++)
{
if (results[x, y] == firstLetter)//found the letter
{
Console.WriteLine("Found it " + " " + firstLetter);
Console.WriteLine(x + " " + y);
SearchRightDirection(x, y);
SearchLeftDirection(x, y);
}
}
}
}
我尝试将位置作为参数传递,例如 SearchRightDirection(char[], int x, int y){} 但是我无法从这个确切的位置行和列数组继续。
你有什么建议吗?另外结构是否正确?
给你:
public static class Sample
{
public static int CountOccurrences(char[,] table, string word)
{
if (string.IsNullOrEmpty(word)) return 0;
int count = 0;
int rowCount = table.GetLength(0);
int colCount = table.GetLength(1);
for (int row = 0; row < rowCount; row++)
{
for (int col = 0; col < colCount; col++)
{
if (table[row, col] != word[0]) continue;
if (word.Length == 1) { count++; continue; }
for (int dy = -1; dy <= 1; dy++)
for (int dx = -1; dx <= 1; dx++)
if ((dx != 0 || dy != 0) && Match(word, table, rowCount, colCount, row, col, dy, dx)) count++;
}
}
return count;
}
private static bool Match(string word, char[,] table, int rowCount, int colCount, int startRow, int startCol, int dy, int dx)
{
int row = startRow + dy;
if (dy != 0 && (dy < 0 ? row : rowCount - row) < word.Length - 1) return false;
int col = startCol + dx;
if (dx != 0 && (dx < 0 ? col : colCount - col) < word.Length - 1) return false;
for (int charPos = 1; charPos < word.Length; row += dy, col += dx, charPos++)
if (table[row, col] != word[charPos]) return false;
return true;
}
}