ปัญหาต่อไปนี้คือตัวอย่างปริศนาอักษรไขว้ของหนังสือพิมพ์รายวัน ในที่นี้เราได้รับอาร์เรย์อักขระ 2 มิติและคำสั่งปัญหาคือการค้นหาคำที่กำหนดจากเขาวงกตอาร์เรย์อักขระ 2 มิติ อัลกอริธึมการค้นหารวมถึงการค้นหาอักขระแต่ละตัวจาก บนลงล่าง ,ขวาไปซ้าย และในทางกลับกันแต่ไม่ใช่แนวทแยง
ให้เราเข้าใจด้วยตัวอย่าง
อินพุต- คำสตริง-LAYS
สตริง 2D[ ] - { "LOAPYS", "KAYSOT", "LAYSST", "MLVAYS", "LAYSAA", "LAOYLS" };
ผลผลิต- จำนวนสตริงที่กำหนดในอาร์เรย์อักขระ 2 มิติ:7
คำอธิบาย - เนื่องจากเราได้รับอาร์เรย์สตริงของคำและจากคำเหล่านั้น เราจึงต้องค้นหาคำว่า "LAYS" ซึ่งสามารถค้นหาได้ในทุกทิศทาง เช่น บน-ล่าง ขวา-ซ้าย ล่าง-บน และซ้าย-ขวา ค่าสถานะตัวนับในโค้ดจะเพิ่มขึ้นทุกครั้งที่พบสตริงการค้นหาที่กำหนด และการนับจะถูกส่งคืนเมื่อสิ้นสุดผลลัพธ์ ในตัวอย่าง เราจะเห็นได้ว่า LAYS เกิดขึ้น 7 ครั้ง นั่นคือ
1->L โอเอ ปYS -LAYS-> ซ้ายไปขวา
2 ->ส อย่า โอล -LAYS(ขวาไปซ้าย)
3->วาง T-LAYS(ซ้ายไปขวา)
4->ML วีAYS- เลย์(ซ้ายไปขวา)
5->เลย์ซ่า A-LAYS(ซ้ายไปขวา)
6->แอลเอ OYLS -LAYS(ซ้ายไปขวา)
7->(ล่างขึ้นบน) ใน เลย์สีแดง
อินพุต- คำสตริง - CAMP
สตริง 2D[ ] - { "BLOOKS", "BPOOLK", "KOHPKB", "BOLKOK", "LKIOOB", "LAHYBL" }
ผลลัพธ์- จำนวนสตริงที่กำหนดในอาร์เรย์อักขระ 2 มิติ:0
คำอธิบาย-: เนื่องจากเราได้รับอาร์เรย์สตริงของคำและจากคำเหล่านั้น เราจึงต้องค้นหาคำว่า "LAYS" ซึ่งสามารถค้นหาได้ในทุกทิศทาง เช่น บน-ล่าง ขวา-ซ้าย ล่าง-บน และซ้าย-ขวา ค่าสถานะตัวนับในโค้ดจะเพิ่มขึ้นทุกครั้งที่พบสตริงการค้นหาที่กำหนด และการนับจะถูกส่งคืนเมื่อสิ้นสุดผลลัพธ์ ในตัวอย่าง เราจะเห็นว่า BOOK ถูกสร้างขึ้น 0 ครั้ง
แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้
- เราได้รับสตริง (คำ) และอาร์เรย์สตริงซึ่งพร้อมกับตัวแปรยูทิลิตี้บางตัวจะถูกส่งไปยัง findString() สำหรับการประมวลผลต่อไป
- อักขระในเมทริกซ์จะถูกข้ามไปและจะมีการหยิบอักขระขึ้นมาเพื่อเริ่มสตริง
- สำหรับอักขระที่ถูกหยิบขึ้นมา เราจะค้นหาสตริงที่กำหนดซ้ำในทุกทิศทางที่เป็นไปได้ตามอัลกอริทึม
- หากพบว่าตรงกัน ตัวนับจะเพิ่มขึ้น
- หลังจากที่เราเสร็จสิ้นด้วยอักขระเริ่มต้นตัวแรกแล้ว กระบวนการจะทำซ้ำสำหรับอักขระตัวถัดไป
- ผลรวมของการนับจะถูกคำนวณด้วยการจับคู่ที่สอดคล้องกัน
- จากนั้น คำตอบสุดท้ายจะถูกบันทึก และผลลัพธ์จะถูกพิมพ์ออกมา
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
int utilitySearch(string word, int r, int c, string arr[], int maxR, int maxC, int index) {
int count = 0;
if (r >= 0 && r <= maxR && c >= 0) {
if (c <= maxC && word[index] == arr[r][c]) {
char res = word[index];
index = index + 1;
arr[r][c] = 0;
if (word[index] == 0) {
count = 1;
} else {
count = count + utilitySearch(word, r, c + 1, arr, maxR, maxC, index);
count = count + utilitySearch(word, r, c - 1, arr, maxR, maxC, index);
count = count + utilitySearch(word, r + 1, c, arr, maxR, maxC, index);
count = count + utilitySearch(word, r - 1, c, arr, maxR, maxC, index);
}
arr[r][c] = res;
}
}
return count;
}
int findString(string word, int r, int c, string str[], int countR, int countC) {
int count = 0;
for (int i = 0; i < countR; ++i) {
for (int j = 0; j < countC; ++j) {
count = count + utilitySearch(word, i, j, str, countR - 1, countC - 1, 0);
}
}
return count;
}
int main() {
string word = "FLOOD";
string inp[] = {"FPLIOKOD","FLOODYUT","YFLOODPU","FMLOSODT","FILPOYOD", FLOOOODE " };
string str[(sizeof(inp) / sizeof( * inp))];
for (int i = 0; i < (sizeof(inp) / sizeof( * inp)); ++i) {
str[i] = inp[i];
}
cout << "Count of number of given string in 2D character array: " << findString(word, 0, 0, str, (sizeof(inp) / sizeof( * inp)), str[0].size());
return 0;
} หากเราเรียกใช้โค้ดข้างต้น มันจะสร้างผลลัพธ์ต่อไปนี้ -
ผลลัพธ์
Count of number of given string in 2D character array: 6