ในปัญหานี้ เราจะได้รับเขาวงกตของจำนวนเต็ม n จำนวนเต็ม แต่ละจำนวนเต็มระบุจำนวนการเคลื่อนไหวที่ต้องทำ พร้อมกับทิศทางที่ระบุโดยใช้ '>' และ '<' งานของเราคือค้นหาว่าสามารถเคลื่อนตัวออกจากเขาวงกตได้หรือไม่ ถ้าจุดเริ่มต้นอยู่ที่ตำแหน่ง 0 ดัชนี
มาดูตัวอย่างทำความเข้าใจปัญหากัน
ป้อนข้อมูล −
3 2 1 1 4 > < > >
ผลผลิต - ใช่
คำอธิบาย − เคลื่อนที่จากจุดเริ่มต้น เราจะเคลื่อนไปข้างหน้า 2 ตำแหน่ง จากนั้นไปข้างหน้า 1 ตำแหน่ง จากนั้นไปข้างหน้า 4 ตำแหน่ง สิ่งนี้จะทำให้เขาวงกตของเราเคลื่อนไหว
เพื่อแก้ปัญหานี้ เราจะตรวจสอบว่าสามารถย้ายออกจากเขาวงกตได้หรือไม่ สำหรับสิ่งนี้เราต้องไปต่ำกว่า 0 หรือสูงกว่า n เริ่มจาก 0 เราจะประมวลผลทิศทางตามเครื่องหมายโดยระบุตำแหน่งจำนวนเต็ม และตรวจสอบว่าถึงจุดสิ้นสุดหรือไม่
อีกเงื่อนไขหนึ่งที่สามารถเกิดขึ้นได้คือวนซ้ำไม่รู้จบ นั่นคือ เงื่อนไขที่ผู้ใช้ไม่เคยออกจากเขาวงกต นี่คือเมื่อเรากลับมาที่ตำแหน่งเยี่ยม ดังนั้น เพื่อตรวจสอบสภาพนี้ เราจะทำเครื่องหมายสถานที่ที่เยี่ยมชมทั้งหมด
ตัวอย่าง
โปรแกรมแสดงการใช้งานโซลูชันของเรา
#include <iostream> using namespace std; void isMazeSolvable (int a[], int n, string s){ int mark[n] = {0}; int start = 0; int possible = 1; while (start >= 0 && start < n){ if (s == "<"){ if (mark[start] == 0){ mark[start] = 1; start -= a[start]; } else { possible = 0; break; } } else { if (mark[start] == 0){ mark[start] = 1; start += a[start]; } else { possible = 0; break; } } } if (possible == 0) cout << "It stays inside the maze forever"; else cout << "It will come out of the maze"; } int main (){ int n = 3; string s = ">><"; int a[] = { 1, 2, 4 }; isMazeSolvable (a, n, s); }
ผลลัพธ์
It will come out of the maze