using System;
public class PuzzleKata
{
private char[,] papan = new char[17, 17]
{
{'J','Y','B','Y','Q','V','W','G','B','Q','F','D','D','U','L','H','M'},
{'D','G','O','C','G','V','N','K','Z','C','R','U','B','A','O','I','K'},
{'U','G','E','U','H','E','W','J','W','T','O','Y','N','U','M','N','V'},
{'N','H','U','R','D','B','R','J','I','V','U','I','T','P','G','H','W'},
{'I','H','H','O','O','I','E','M','Z','W','T','J','M','D','T','S','V'},
{'T','M','V','O','I','P','O','U','A','N','B','E','D','X','T','W','X'},
{'E','Z','H','B','B','Q','A','U','E','N','W','C','W','C','B','O','N'},
{'D','L','U','S','A','D','F','G','N','R','Y','Y','G','W','W','S','R'},
{'K','H','Y','I','I','R','R','M','N','I','P','H','A','B','R','W','P'},
{'I','T','Q','M','S','A','H','I','M','I','R','U','N','Z','Y','H','S'},
{'N','E','T','H','E','R','L','A','N','D','S','H','U','N','K','E','Z'},
{'G','F','K','L','N','L','A','G','U','T','R','O','P','B','I','U','E'},
{'D','C','P','G','O','G','G','A','R','U','P','U','E','O','P','K','M'},
{'O','J','B','T','D','N','T','A','X','O','B','X','Z','M','J','C','C'},
{'M','J','F','P','N','S','L','L','X','B','V','C','Y','W','T','K','E'},
{'R','X','I','S','I','I','Z','W','A','M','K','S','L','N','H','V','S'},
{'A','O','J','O','A','E','G','T','X','M','C','Z','P','C','I','O','U'}
};
// Define arah
private int[,] arah = new int[,] {
{ -1, -1 }, { -1, 0 }, { -1, 1 }, { 0, -1 }, { 0, 1 }, { 1, -1 }, { 1, 0 }, { 1, 1 }
};
public List<(int, int)> CariKata(string kata)
{
int n = papan.GetLength(0); // baris
int m = papan.GetLength(1); // kolom
kata = kata.ToUpper();
for (int row = 0; row < n; row++)
{
for (int col = 0; col < m; col++)
{
if (papan[row, col] != kata[0]) continue;
for (int d = 0; d < 8; d++)
{
int dx = arah[d, 0]; // perubahan baris
int dy = arah[d, 1]; // perubahan kolom
int x = row, y = col;
List<(int, int)> posisi = new List<(int, int)>();
int k;
for (k = 0; k < kata.Length; k++)
{
if (x < 0 || x >= n || y < 0 || y >= m || papan[x, y] != kata[k])
break;
posisi.Add((y, x)); // Urutan kolom ke baris sesuai contoh dari soal
x += dx;
y += dy;
}
if (k == kata.Length)
return posisi;
}
}
}
return new List<(int, int)>(); // kata tidak ditemukan
}
}
public class Test
{
public static void Main()
{
PuzzleKata puzzle = new PuzzleKata();
var kata1 = puzzle.CariKata("germany");
PrintHasil("germany", kata1);
var kata2 = puzzle.CariKata("italy");
PrintHasil("italy", kata2);
}
public static void PrintHasil(string kata, List<(int, int)> koordinat)
{
Console.WriteLine($"Kata: {kata}");
if (koordinat.Count == 0)
{
Console.WriteLine("[ ]");
}
else
{
foreach (var (col, row) in koordinat)
Console.Write($"[{col},{row}] ");
Console.WriteLine();
}
Console.WriteLine();
}
}
dXNpbmcgU3lzdGVtOwoKcHVibGljIGNsYXNzIFB1enpsZUthdGEKewogICAgcHJpdmF0ZSBjaGFyWyxdIHBhcGFuID0gbmV3IGNoYXJbMTcsIDE3XQogICAgewogICAgeydKJywnWScsJ0InLCdZJywnUScsJ1YnLCdXJywnRycsJ0InLCdRJywnRicsJ0QnLCdEJywnVScsJ0wnLCdIJywnTSd9LAogICAgeydEJywnRycsJ08nLCdDJywnRycsJ1YnLCdOJywnSycsJ1onLCdDJywnUicsJ1UnLCdCJywnQScsJ08nLCdJJywnSyd9LAogICAgeydVJywnRycsJ0UnLCdVJywnSCcsJ0UnLCdXJywnSicsJ1cnLCdUJywnTycsJ1knLCdOJywnVScsJ00nLCdOJywnVid9LAogICAgeydOJywnSCcsJ1UnLCdSJywnRCcsJ0InLCdSJywnSicsJ0knLCdWJywnVScsJ0knLCdUJywnUCcsJ0cnLCdIJywnVyd9LAogICAgeydJJywnSCcsJ0gnLCdPJywnTycsJ0knLCdFJywnTScsJ1onLCdXJywnVCcsJ0onLCdNJywnRCcsJ1QnLCdTJywnVid9LAogICAgeydUJywnTScsJ1YnLCdPJywnSScsJ1AnLCdPJywnVScsJ0EnLCdOJywnQicsJ0UnLCdEJywnWCcsJ1QnLCdXJywnWCd9LAogICAgeydFJywnWicsJ0gnLCdCJywnQicsJ1EnLCdBJywnVScsJ0UnLCdOJywnVycsJ0MnLCdXJywnQycsJ0InLCdPJywnTid9LAogICAgeydEJywnTCcsJ1UnLCdTJywnQScsJ0QnLCdGJywnRycsJ04nLCdSJywnWScsJ1knLCdHJywnVycsJ1cnLCdTJywnUid9LAogICAgeydLJywnSCcsJ1knLCdJJywnSScsJ1InLCdSJywnTScsJ04nLCdJJywnUCcsJ0gnLCdBJywnQicsJ1InLCdXJywnUCd9LAogICAgeydJJywnVCcsJ1EnLCdNJywnUycsJ0EnLCdIJywnSScsJ00nLCdJJywnUicsJ1UnLCdOJywnWicsJ1knLCdIJywnUyd9LAogICAgeydOJywnRScsJ1QnLCdIJywnRScsJ1InLCdMJywnQScsJ04nLCdEJywnUycsJ0gnLCdVJywnTicsJ0snLCdFJywnWid9LAogICAgeydHJywnRicsJ0snLCdMJywnTicsJ0wnLCdBJywnRycsJ1UnLCdUJywnUicsJ08nLCdQJywnQicsJ0knLCdVJywnRSd9LAogICAgeydEJywnQycsJ1AnLCdHJywnTycsJ0cnLCdHJywnQScsJ1InLCdVJywnUCcsJ1UnLCdFJywnTycsJ1AnLCdLJywnTSd9LAogICAgeydPJywnSicsJ0InLCdUJywnRCcsJ04nLCdUJywnQScsJ1gnLCdPJywnQicsJ1gnLCdaJywnTScsJ0onLCdDJywnQyd9LAogICAgeydNJywnSicsJ0YnLCdQJywnTicsJ1MnLCdMJywnTCcsJ1gnLCdCJywnVicsJ0MnLCdZJywnVycsJ1QnLCdLJywnRSd9LAogICAgeydSJywnWCcsJ0knLCdTJywnSScsJ0knLCdaJywnVycsJ0EnLCdNJywnSycsJ1MnLCdMJywnTicsJ0gnLCdWJywnUyd9LAogICAgeydBJywnTycsJ0onLCdPJywnQScsJ0UnLCdHJywnVCcsJ1gnLCdNJywnQycsJ1onLCdQJywnQycsJ0knLCdPJywnVSd9CiAgICB9OwoKICAgIC8vIERlZmluZSBhcmFoCiAgICBwcml2YXRlIGludFssXSBhcmFoID0gbmV3IGludFssXSB7CiAgICAgICAgeyAtMSwgLTEgfSwgeyAtMSwgMCB9LCB7IC0xLCAxIH0sIHsgMCwgLTEgfSwgeyAwLCAxIH0sIHsgMSwgLTEgfSwgeyAxLCAwIH0sIHsgMSwgMSB9CiAgICB9OwoKICAgIHB1YmxpYyBMaXN0PChpbnQsIGludCk+IENhcmlLYXRhKHN0cmluZyBrYXRhKQogICAgewogICAgICAgIGludCBuID0gcGFwYW4uR2V0TGVuZ3RoKDApOyAvLyBiYXJpcwogICAgICAgIGludCBtID0gcGFwYW4uR2V0TGVuZ3RoKDEpOyAvLyBrb2xvbQogICAgICAgIGthdGEgPSBrYXRhLlRvVXBwZXIoKTsKCiAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbjsgcm93KyspCiAgICAgICAgewogICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtOyBjb2wrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHBhcGFuW3JvdywgY29sXSAhPSBrYXRhWzBdKSBjb250aW51ZTsKCiAgICAgICAgICAgICAgICBmb3IgKGludCBkID0gMDsgZCA8IDg7IGQrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnQgZHggPSBhcmFoW2QsIDBdOyAvLyBwZXJ1YmFoYW4gYmFyaXMKICAgICAgICAgICAgICAgICAgICBpbnQgZHkgPSBhcmFoW2QsIDFdOyAvLyBwZXJ1YmFoYW4ga29sb20KICAgICAgICAgICAgICAgICAgICBpbnQgeCA9IHJvdywgeSA9IGNvbDsKICAgICAgICAgICAgICAgICAgICBMaXN0PChpbnQsIGludCk+IHBvc2lzaSA9IG5ldyBMaXN0PChpbnQsIGludCk+KCk7CgogICAgICAgICAgICAgICAgICAgIGludCBrOwogICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBrYXRhLkxlbmd0aDsgaysrKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggPCAwIHx8IHggPj0gbiB8fCB5IDwgMCB8fCB5ID49IG0gfHwgcGFwYW5beCwgeV0gIT0ga2F0YVtrXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXNpLkFkZCgoeSwgeCkpOyAvLyBVcnV0YW4ga29sb20ga2UgYmFyaXMgc2VzdWFpIGNvbnRvaCBkYXJpIHNvYWwKICAgICAgICAgICAgICAgICAgICAgICAgeCArPSBkeDsKICAgICAgICAgICAgICAgICAgICAgICAgeSArPSBkeTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmIChrID09IGthdGEuTGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9zaXNpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IExpc3Q8KGludCwgaW50KT4oKTsgLy8ga2F0YSB0aWRhayBkaXRlbXVrYW4KICAgIH0KfQoKcHVibGljIGNsYXNzIFRlc3QKewoJcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQoJewoJCVB1enpsZUthdGEgcHV6emxlID0gbmV3IFB1enpsZUthdGEoKTsKCgkJdmFyIGthdGExID0gcHV6emxlLkNhcmlLYXRhKCJnZXJtYW55Iik7CgkJUHJpbnRIYXNpbCgiZ2VybWFueSIsIGthdGExKTsKCQkKCQl2YXIga2F0YTIgPSBwdXp6bGUuQ2FyaUthdGEoIml0YWx5Iik7CgkJUHJpbnRIYXNpbCgiaXRhbHkiLCBrYXRhMik7Cgl9CgkKCXB1YmxpYyBzdGF0aWMgdm9pZCBQcmludEhhc2lsKHN0cmluZyBrYXRhLCBMaXN0PChpbnQsIGludCk+IGtvb3JkaW5hdCkKCXsKCQlDb25zb2xlLldyaXRlTGluZSgkIkthdGE6IHtrYXRhfSIpOwoJICAgIGlmIChrb29yZGluYXQuQ291bnQgPT0gMCkKCSAgICB7CgkgICAgCUNvbnNvbGUuV3JpdGVMaW5lKCJbIF0iKTsKCSAgICB9CgkgICAgZWxzZQoJICAgIHsKCSAgICAgICAgZm9yZWFjaCAodmFyIChjb2wsIHJvdykgaW4ga29vcmRpbmF0KQoJICAgICAgICBDb25zb2xlLldyaXRlKCQiW3tjb2x9LHtyb3d9XSAiKTsKCSAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKCSAgICB9CgkgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKCSB9Cn0K