পতনশীল ব্লক এবং জটিল আকার


10

আমার কাছে বর্তমানে টেট্রিস-এর মতো একটি সাধারণ খেলা আছে এবং আমি যে সমস্যাটি সমাধান করতে পারি না তা পেয়ে এসেছি।

টেট্রিসের বিপরীতে যেখানে একক পতনশীল আকার রয়েছে, আমার একাধিক, সম্ভাব্য ইন্টারলকিং আকার রয়েছে যা পড়তে হবে; আমি তাদের চূড়ান্ত অবস্থান গণনা করা প্রয়োজন। নিম্নোক্ত বিবেচনা কর:

পড়ন্ত ব্লক সমস্যার উদাহরণ

  1. সবুজ আকৃতির চূড়ান্ত অবস্থান গণনা করতে, আমি অন্য স্কোয়ার বা বোর্ডের প্রান্তে আঘাত না করা পর্যন্ত আমি প্রতিটি স্কয়ারের জন্য কেবল স্ক্যান করে নিই। সম্পন্ন

  2. একাধিক, সাধারণ আকারের জন্য আমি বোর্ডের মতো আমার কাজ করি। এইভাবে লালটি সরে যাওয়ার প্রয়োজন নেই বলে দেখা গেছে, কমলা একের পর এক, সবুজ তিনটি নীচে নেমে গেছে।সম্পন্ন

  3. ইন্টারলকড সবুজ এবং লাল আকারগুলি কীভাবে চিকিত্সা করা যায় তা আমি জানি না। # 2 এর যুক্তি ব্যবহার করে আমরা "আটকে" ভাসমান মধ্য বায়ুতে শেষ করব। আমি যদি সবুজ আকারের জন্য স্ক্যান ডাউন করি তবে আমি লালটির মুখোমুখি হয়েছি এবং এইভাবে সরানো হয় না এবং লালটির জন্য তদ্বিপরীত হয়। সমাধানটি দুটি আকারকে এক হিসাবে বিবেচনা করা হতে পারে।

  4. # 3 এর মতো, এই দৃশ্যে আমি বস্তুকেও এক হিসাবে বিবেচনা করে সফল হতে পারি।

  5. # 3 এবং # 4 এর বিপরীতে আমি আকারটিকে এক হিসাবে ব্যবহার করতে পারি না কারণ কমলা শেপটি খুব উচ্চতায় এক বর্গাকার ভাসমান অবধি শেষ হবে ...

  6. সমস্যার আরেকটি প্রকরণ # 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);
}

অ্যানিমেটেড জিআইএফ সমাধানের প্রতিটি পাস দেখাচ্ছে

সংক্ষেপ:

  • যখন একটি স্কোয়ার "থামানো" হয়, আমরাও থামি:
    • এর উপরে যে কোনও বর্গক্ষেত্র। সর্বদা.
    • প্রতিবেশী বর্গ যা আমরা সংযুক্ত (যেমন একই আকৃতি)।
  • আমরা পুরো নীচের সারিটি বন্ধ করি এবং ফাংশনটি স্কোয়ারগুলির মধ্যে পুনরাবৃত্তি হয়।
  • সমস্ত স্কোয়ার বন্ধ না হওয়া পর্যন্ত আমরা পুনরাবৃত্তি করি।
  • তারপর আমরা প্রাণবন্ত।

যৌক্তিক অনুক্রমের প্রতিটি পাস দেখাচ্ছে অ্যানিমেটেড জিআইএফ


আমি ভাবছি আপনি যদি 5 টি সমাধান করেন তবে সেই সমাধানও হবে be আসলে, আমি বিশ্বাস করি 5 টি সমাধান করা সম্ভবত এই সমস্ত পরিস্থিতি সমাধান করবে।
অ্যান্ডস্কোর জিরো

ভাগ করে নেওয়ার জন্য ধন্যবাদ +1। আশ্চর্যজনক সমাধান। অ্যানিমেশনটি
ভালোবাসুন

চিয়ার্স অ্যাশেহ ৯৯৯, আমার মনে হয় আমার তীরগুলির সাথে একটি নতুন অ্যানিমেশন দরকার যা এটি দেখায় যে কীভাবে স্টপ যুক্তিটি নীচের সারি থেকে "প্রবাহিত" হয় এবং পুরো পর্যায়ে প্রসারিত হয় ...
ওডাভিড

উত্তর:


4

ঠিক আছে, চলন্ত আকারের এবং বিশ্রামে থাকা আকারগুলির মধ্যে কোনও পার্থক্য থাকলে আপনার আকৃতির সাথে একেবারে চিকিত্সা করার দরকার নেই। একটি আকৃতি (এ) তার নীচে একটি আকৃতি (বি) সনাক্ত করতে পারে এবং যদি এটি চলমান হয়, তবে বি আকারটি তার নীচে সরাসরি কিছু আছে কিনা তা দেখতে পারে এবং যদি বিশ্রামের আকার থাকে, তবে এখন A এবং B বিশ্রাম নিচ্ছে এবং যদি কিছুই না থাকে তবে তারা উভয়ই নীচে নেমে যায়, তবে যদি কোনও চলমান আকৃতি থাকে তবে এই নতুন আকৃতিটি এ এবং বি দ্বারা 'চিকিত্সা বি' হিসাবে বিবেচিত হবে, সুতরাং এটি ধরণের পুনরাবৃত্তি হয়। মনে রাখবেন যে প্রতিটি পদক্ষেপের জন্য, সর্বনিম্ন আকারগুলিকে প্রথমে তাদের নীচে আকারগুলি পরীক্ষা করা দরকার।

সুতরাং, সমস্যা # for এর জন্য, সবুজ আকারটি সর্বনিম্ন চলমান আকার এবং এটি দেখতে পাবে যে এর নীচে কেবল নীচের একমাত্র আকারটি লাল আকার shape তাই লাল শেপটি তার নীচে কিছুই আবিষ্কার করতে পারে না এবং তারা নীচে সরে যাবে they । সবুজ আকারটি কমলার আকারের সাথে সংলগ্ন হয়ে গেলে, এটি বিশ্রাম নেবে, এবং লাল আকারটি নীচে সরবে এবং তারপরে বিশ্রামের সবুজ আকৃতিটি সনাক্ত করবে এবং এটি খুব বিশ্রামও পাবে।


আমি কি এই ভেবে ঠিক আছি যে আমরা ধরে নিতে চাই যে সমস্ত আকারগুলি অন্যথায় প্রমাণিত না হওয়া অবধি শান্ত নয়?
oodavid

আমি এই নিয়ে চিন্তা করার জন্য কিছুটা সময় ব্যয় করেছি এবং আমি অবশ্যই বলব এটি খুব ভাল প্রযুক্তির মতো বলে মনে হচ্ছে। আমি আগামীকাল / সপ্তাহান্তে চেষ্টা করে দেখব এবং এটি কীভাবে বন্ধ হয়ে গেছে।
oodavid

3

একক মূল থেকে # 5 এবং # 6 স্টেমের ক্ষেত্রে সমস্যাটি মনে হচ্ছে: আপনি কেবল একটি চলাচল পরীক্ষা যাচ্ছেন।আপনার কোনও কিছু সরানো না জানা পর্যন্ত আপনার জিনিসগুলিকে নীচে নামিয়ে দেওয়া উচিত (এটিকে "মহাকর্ষের পাস" বলতে দিন)।

উদাহরণস্বরূপ, 6 ক্ষেত্রে, আপনি যদি একাধিক পাস ব্যবহার করেন তবে এটিই ঘটবে:

  • কমলা নীচে সরানো
  • সবুজ নীচে সরানো
  • কমলা নীচে সরানো
  • সবুজ নীচে সরানো
  • কমলা নীচে সরানো
  • কিছুই কম যায় না (সম্পন্ন!)

একাধিক মাধ্যাকর্ষণ পাসের এই কৌশলটি # 5 টিও সমাধান করতে পারে, যদিও এটি # 3 এবং # 4 ক্ষেত্রে সহায়তা করবে না যেখানে মনে হয় আপনাকে তাদের এক টুকরো এর মতো আচরণ করা দরকার।

দুটি বা ততোধিক টুকরো যখন একক টুকরো হিসাবে বিবেচনা করা উচিত তখন আলাদা করার জন্য, আমি মনে করি যে সমস্ত টুকরোটির সম্মিলিত স্থানে কোনও "গর্ত" আছে কিনা তা পরীক্ষা করা সবচেয়ে সহজ অ্যালগরিদম। যদি থাকে তবে এটি একাধিক টুকরো হিসাবে বিবেচনা করা যেতে পারে।


1
# 3 এবং # 4 এর সাথেও তারতম্য হতে পারে যেখানে বলুন 2 বা 3 টি আকারগুলি একটি বৃহত্তর "সি" আকার দ্বারা সম্পূর্ণরূপে বদ্ধ থাকে, টুকরা জমে থাকে কিনা তা নির্ধারণ করে আরও সমস্যা দেখা দিতে পারে। আমি যাব এবং দেখি যে এটি কী আসে! চিয়ারস @ অ্যাশেজ999
ওডাভিড

@ আপনার প্রয়োজনীয়তা / নকশা আমার কাছে অযথা জটিল বলে মনে হচ্ছে। এই সমস্যাগুলি সমাধান করার সাথে সাথে সহজ কিছু দিয়ে শুরু করুন এবং আপনার পথে কাজ করুন।
ashes999

নাহ, এই সমস্যাটি আরও জটিল সমস্যা বর্ণনা করার জন্য সম্পূর্ণ সরলিকৃত / বিমূর্ত উপায় racted আমি তাড়া করার রোমাঞ্চের জন্য এটি করছি!
oodavid
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.