গেম − একটি n × n স্কয়ারের অ্যারে কল্পনা করুন। এইগুলোর মধ্যে, কিছু স্কয়ার খালি, কিছু সলিড, এবং কিছু নন-সলিড স্কয়ার ১, ২, ৩, ... দিয়ে মার্ক করা। প্রতিটি ইন্টিজার বোর্ডে এক্সাক্টলি দুটি আলাদা স্কয়ার আক্যুপাই করে। প্লেয়ারের টাস্ক হল প্রতিটি ইন্টিজারের দুটি আওয়ারেন্সকে বোর্ডে কানেক্ট করা একটি সিম্পল পাথ দিয়ে যেটি শুধু হরিজন্টাল এবং ভার্টিক্যাল মুভমেন্ট ব্যবহার করে। দুটি ভিন্ন পাথ একে অপরের সাথে ইন্টারসেক্ট করতে পারবে না। কোনো পাথ যেকোনো সলিড স্কয়ার ইনক্লুড করতে পারবে না (সলিড স্কয়ার কোনো পാതে আপনার করতে পারবে না)। অবশেষে, সকল নন-সলিড স্কয়ার পাথ দিয়ে ফিল্ড হতে হবে।
অ্যালগরিদম − একটি বৈধ র্যান্ডম পাজল কনস্ট্রাক্ট করার জন্য দেয়া বোর্ড সাইজ n × n-এ, আমরা প্রথমে র্যান্ডম সিম্পল মিউচুয়ালি নন-ইন্টারসেক্টিং পাথ বোর্ডে প্রডিউস করি। যদি কিছু আইসোলেটেড স্কয়ার সকল জেনারেটেড পাথের বাইরে থাকে, এই আইসোলেটেড স্কয়ারগুলোকে সলিড (ফরবিডেন) হিসেবে মার্ক করুন। এরপর পাথের এন্ডপয়েন্টগুলো এবং সলিড স্কয়ারগুলোর লিস্ট পাজল হিসেবে দিন।
এভাবেই আমরা প্রথমে একটি সমাধান প্রডিউস করি, এবং তারপর সমাধান থেকে পাজল বের করি। পাথগুলো এবং সলিড স্কয়ারগুলো n × n বোর্ডকে পার্টিশন বা বিভক্ত করে। আমরা এই পার্টিশন প্রডিউস করতে यूनিয়ন-ফাইন্ড ডেটা স্ট্রাকচার ইমপ্লিমেন্ট করি। ডেটা স্ট্রাকচারটি বোর্ডে n² স্কয়ারের সেটের সাবসেটগুলো ডিল করে।
PseudoCode
বোর্ডে (a, b) এবং (c, d) স্কয়ার র্যান্ডমলি লোকেট করুন যাতে −
(a, b) এবং (c, d) একে অপরের নেighbour, এবং
নতুন পথের শুরুতে (a, b) এবং (c, d))。
(a, b) এবং (c, d) ধারণকারী দুটি ইউনিয়ন-ফাইন্ড ট্রি ইউনিয়ন করুন।
ততক্ষণ রিপিট করুন যতক্ষণ কারেন্ট পাথ এক্সটেন্ড করা যায় −
(a, b) = (c, d) রিনেম করুন।
(a, b)-এর একটি র্যান্ডম নেighbouring স্কয়ার (c, d) লোকেট করুন যাতে −
(c, d) কোনো পাথে بيلঙ করে না (কারেন্টটি সহ)
(c, d)-এর একমাত্র নেighbour পার্শিয়ালি কনস্ট্রাক্টেড কারেন্ট পাথে (a, b)।
যদি এমন কোনো নেighbour (c, d) না পাওয়া যায়, পাথ আর এক্সটেন্ড করা যায় না, তাই লুপ ব্রেক করুন
অন্যথায়, (a, b) এবং (c, d) যেসব ইউনিয়ন-ফাইন্ড ট্রিতে বেলঙ করে তাদের ইউনিয়ন করুন।
নতুন পাথের শুরু এবং শেষের দুটি স্কয়ারের এন্ডপয়েন্ট ফ্ল্যাগ সেট করুন।
SUCCESS রিটার্ন করুন