ปัญหาต่อไปนี้คือตัวอย่างปริศนาอักษรไขว้ของหนังสือพิมพ์รายวัน ในที่นี้เราได้รับอาร์เรย์อักขระ 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