สมมติว่าเรามีสตริง S ขนาด n และอีกจำนวนหนึ่งคือ k สตริงประกอบด้วยอักขระสี่ประเภท พิจารณาว่ามีเซลล์ไม่กี่เซลล์ ตั๊กแตนต้องการกระโดดเพื่อไปให้ถึงเป้าหมาย อักขระ '.' หมายความว่าเซลล์ที่เกี่ยวข้องว่างเปล่า อักขระ '#' หมายความว่าเซลล์ที่เกี่ยวข้องมีสิ่งกีดขวางและตั๊กแตนไม่สามารถกระโดดได้ 'G' หมายความว่าตั๊กแตนเริ่มต้นที่ตำแหน่งนี้ และ 'T' หมายถึงเซลล์เป้าหมาย ตั๊กแตนสามารถกระโดดออกจากตำแหน่งปัจจุบันได้ k เซลล์ เราต้องเช็คก่อนว่าตั๊กแตนจะกระโดดเข้าหาเป้าหมายได้หรือไม่
ดังนั้นหากอินพุตเป็นเช่น S ="#G#T#"; k =2 ผลลัพธ์จะเป็น True เพราะจาก G ถึง T อยู่ห่างออกไป 2 เซลล์ และ k คือ 2 ดังนั้นตั๊กแตนจึงสามารถไปถึงที่นั่นได้ด้วยการกระโดดเพียงครั้งเดียว
ขั้นตอน
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
n := size of S x := position of 'G' in S y := position of 'T' in S if x > y, then: swap x and y for initialize i := x, when i < y, update i := i + k, do: if S[i] is same as '#', then: Come out from the loop if i is same as y, then: return true Otherwise return false
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; bool solve(string S, int k) { int n = S.size(); int i; int x = S.find('G'); int y = S.find('T'); if (x > y) swap(x, y); for (i = x; i < y; i += k) { if (S[i] == '#') break; } if (i == y) return true; else return false; } int main() { string S = "#G#T#"; int k = 2; cout << solve(S, k) << endl; }
อินพุต
"#G#T#", 2
ผลลัพธ์
1