Tôi đang viết một câu đố tìm kiếm từ trong C# và tôi muốn tìm kiếm mảng ký tự hai chiều cho các từ theo cách thanh lịch.Làm cách nào để tìm kiếm mảng hai chiều theo bất kỳ hướng nào
Các tìm kiếm cơ bản từ trái sang phải, từ trên xuống dưới, không khó để viết, tuy nhiên mọi thứ bắt đầu nhận được một chút tiết khi tìm kiếm theo đường chéo qua mảng. Tôi đã có nó làm việc nhưng tôi chắc chắn có một giải pháp tốt hơn ra khỏi đó.
Đây là ví dụ về câu đố tôi đang cố giải quyết, mọi ý tưởng sẽ được đánh giá cao.
BXXD
AXEX
TRXX
FXXX
BAT FRED
EDIT: Kudos để Steve đã cho tôi ý tưởng tìm kiếm điểm la bàn
EDIT: Kết quả của tìm kiếm cần trả về toạ độ x1, y1 và x2, y2 của các từ trong ar cá đuối.
EDIT: Nhờ Antti để cung cấp thuật toán tốt để tìm kiếm mảng.
Kết quả cuối cùng mà tôi đã đưa ra. Tôi đã dựa trên thuật toán trong câu trả lời của Antti, đã sửa đổi nó để trả về bù đắp mảng cho đầu và cuối của bất kỳ từ nào được tìm thấy. Thuật toán này sẽ được sử dụng một trò chơi Word Search tôi đang viết trong WPF, cho trẻ em của tôi. Cảm ơn tất cả mọi người đã giúp tôi. Tôi sẽ đăng một liên kết ở đây đến ứng dụng khi nó đáng kính.
public class Range
{
public Range(Coordinate start, Coordinate end)
{
Start = start;
End = end;
}
public Coordinate Start { get; set; }
public Coordinate End { get; set; }
}
public class Coordinate
{
public Coordinate(int x, int y)
{
X = x;
Y = y;
}
public int X { get; set; }
public int Y { get; set; }
}
public class WordSearcher
{
public WordSearcher(char[,] puzzle)
{
Puzzle = puzzle;
}
public char[,] Puzzle { get; set; }
// represents the array offsets for each
// character surrounding the current one
private Coordinate[] directions =
{
new Coordinate(-1, 0), // West
new Coordinate(-1,-1), // North West
new Coordinate(0, -1), // North
new Coordinate(1, -1), // North East
new Coordinate(1, 0), // East
new Coordinate(1, 1), // South East
new Coordinate(0, 1), // South
new Coordinate(-1, 1) // South West
};
public Range Search(string word)
{
// scan the puzzle line by line
for (int y = 0; y < Puzzle.GetLength(0); y++)
{
for (int x = 0; x < Puzzle.GetLength(1); x++)
{
if (Puzzle[y, x] == word[0])
{
// and when we find a character that matches
// the start of the word, scan in each direction
// around it looking for the rest of the word
var start = new Coordinate(x, y);
var end = SearchEachDirection(word, x, y);
if (end != null)
{
return new Range(start, end);
}
}
}
}
return null;
}
private Coordinate SearchEachDirection(string word, int x, int y)
{
char[] chars = word.ToCharArray();
for (int direction = 0; direction < 8; direction++)
{
var reference = SearchDirection(chars, x, y, direction);
if (reference != null)
{
return reference;
}
}
return null;
}
private Coordinate SearchDirection(char[] chars, int x, int y, int direction)
{
// have we ve moved passed the boundary of the puzzle
if (x < 0 || y < 0 || x >= Puzzle.GetLength(1) || y >= Puzzle.GetLength(0))
return null;
if (Puzzle[y, x] != chars[0])
return null;
// when we reach the last character in the word
// the values of x,y represent location in the
// puzzle where the word stops
if (chars.Length == 1)
return new Coordinate(x, y);
// test the next character in the current direction
char[] copy = new char[chars.Length - 1];
Array.Copy(chars, 1, copy, 0, chars.Length - 1);
return SearchDirection(copy, x + directions[direction].X, y + directions[direction].Y, direction);
}
}
Nếu bạn thấy phương pháp hiện tại của bạn một người nào đó có thể có một phương pháp tốt hơn. Cho đến khi chúng tôi biết làm thế nào bạn hiện đang làm nó, chúng tôi thực sự không thể cải thiện nó. – gingerbreadboy
Nó dài và xấu xí và không thực sự đáng để dành thời gian để phê bình. Tôi đã hy vọng một người nào đó có kiến thức tốt hơn về một cấu trúc dữ liệu và thuật toán hơn tôi sẽ có thể chỉ cho tôi đi đúng hướng. –