আমার কাছে বর্তমানে টেট্রিস-এর মতো একটি সাধারণ খেলা আছে এবং আমি যে সমস্যাটি সমাধান করতে পারি না তা পেয়ে এসেছি।
টেট্রিসের বিপরীতে যেখানে একক পতনশীল আকার রয়েছে, আমার একাধিক, সম্ভাব্য ইন্টারলকিং আকার রয়েছে যা পড়তে হবে; আমি তাদের চূড়ান্ত অবস্থান গণনা করা প্রয়োজন। নিম্নোক্ত বিবেচনা কর:
সবুজ আকৃতির চূড়ান্ত অবস্থান গণনা করতে, আমি অন্য স্কোয়ার বা বোর্ডের প্রান্তে আঘাত না করা পর্যন্ত আমি প্রতিটি স্কয়ারের জন্য কেবল স্ক্যান করে নিই। সম্পন্ন
একাধিক, সাধারণ আকারের জন্য আমি বোর্ডের মতো আমার কাজ করি। এইভাবে লালটি সরে যাওয়ার প্রয়োজন নেই বলে দেখা গেছে, কমলা একের পর এক, সবুজ তিনটি নীচে নেমে গেছে।সম্পন্ন
ইন্টারলকড সবুজ এবং লাল আকারগুলি কীভাবে চিকিত্সা করা যায় তা আমি জানি না। # 2 এর যুক্তি ব্যবহার করে আমরা "আটকে" ভাসমান মধ্য বায়ুতে শেষ করব। আমি যদি সবুজ আকারের জন্য স্ক্যান ডাউন করি তবে আমি লালটির মুখোমুখি হয়েছি এবং এইভাবে সরানো হয় না এবং লালটির জন্য তদ্বিপরীত হয়। সমাধানটি দুটি আকারকে এক হিসাবে বিবেচনা করা হতে পারে।
# 3 এর মতো, এই দৃশ্যে আমি বস্তুকেও এক হিসাবে বিবেচনা করে সফল হতে পারি।
# 3 এবং # 4 এর বিপরীতে আমি আকারটিকে এক হিসাবে ব্যবহার করতে পারি না কারণ কমলা শেপটি খুব উচ্চতায় এক বর্গাকার ভাসমান অবধি শেষ হবে ...
সমস্যার আরেকটি প্রকরণ # 6।
অন্যান্য পরিস্থিতি থাকতে পারে যার দ্বারা আমার অনেকগুলি আকার রয়েছে যা আরও বেশি জটিল পরিস্থিতিতে অন্তর্নির্মিত হয়, তবে আমি মনে করি উপরেরটি সমস্যার সবচেয়ে মৌলিক অংশগুলি কভার করে।
আমি মনে করি যে একটি দুর্দান্ত সমাধান রয়েছে যা এখনও আমার মুখোমুখি / চিন্তা করতে হয়নি এবং কোনও অন্তর্দৃষ্টি, ধারণা বা সংস্থানগুলিতে খুব কৃতজ্ঞ হব।
সমাধান
আমি যে সমাধানটি নিয়ে এসেছি তা প্রকৃতপক্ষে মার্জিত, নীচে @ ব্যবহারকারী 35958 এর উত্তরের ভিত্তিতে, আমি নিম্নলিখিত পুনরাবৃত্ত ফাংশন তৈরি করেছি (সিউডো কোড)
function stop(square1, square2){
// Skip if we're already stopped
if(square1.stopped){
return;
}
// Are we comparing squares?
if(!square2){
// We are NOT comparing squares, simply stop.
square1.stopped = true;
} else {
// Stop IF
// square1 is directly above square2
// square1 is connected to square2 (part of the same complex shape)
if(square1.x == square2.x && square1.y == (square2.y+1) || isConnected(square1, square2)){
square1.stopped = true;
}
}
// If we're now stopped, we must recurse to our neighbours
stop(square1, squareAbove);
stop(square1, squareBelow);
stop(square1, squareRight);
stop(square1, squareDown);
}
অ্যানিমেটেড জিআইএফ সমাধানের প্রতিটি পাস দেখাচ্ছে
সংক্ষেপ:
- যখন একটি স্কোয়ার "থামানো" হয়, আমরাও থামি:
- এর উপরে যে কোনও বর্গক্ষেত্র। সর্বদা.
- প্রতিবেশী বর্গ যা আমরা সংযুক্ত (যেমন একই আকৃতি)।
- আমরা পুরো নীচের সারিটি বন্ধ করি এবং ফাংশনটি স্কোয়ারগুলির মধ্যে পুনরাবৃত্তি হয়।
- সমস্ত স্কোয়ার বন্ধ না হওয়া পর্যন্ত আমরা পুনরাবৃত্তি করি।
- তারপর আমরা প্রাণবন্ত।