গ্রিড-ফিলিং মেইন্ডার সম্পূর্ণ করুন


18

গ্রিড-ফিলিং মেইন্ডার এমন একটি বদ্ধ পথ যা বর্গ গ্রিডের প্রতিটি কক্ষ একবারে একবারে পরিদর্শন করে , সংলগ্ন কোষগুলির মধ্যে কোনও প্রান্ত একাধিকবার অতিক্রম করবে না এবং কখনও নিজেকে অতিক্রম করবে না। উদাহরণ স্বরূপ:N×N

একবার ভরাট হয়ে গেলে গ্রিডের প্রতিটি কক্ষ নিম্নলিখিত 8 টি টাইলগুলির মধ্যে একটির দ্বারা প্রতিনিধিত্ব করা যেতে পারে:

এইভাবে সংখ্যাযুক্ত, উপরের মাইন্ডার টাইলগুলি এই ম্যাট্রিক্স দ্বারা উপস্থাপিত হতে পারে:

5 6 5 6
4 8 3 2
5 7 6 2
4 3 4 3

আপনার কাজটি হ'ল একটি গ্রিড-ফিলিং মায়ান্দার সম্পূর্ণরূপে টাইলসের সেট না দেওয়া। উদাহরণস্বরূপ, অসম্পূর্ণ ছদ্মবেশ:

... যা 0হারিয়ে যাওয়া টাইলসের জন্য ব্যবহার করে প্রতিনিধিত্ব করা যেতে পারে :

5 0 0 0 6
0 0 7 0 0
0 0 0 0 3
2 4 0 0 0
0 0 3 0 0

... এভাবে সম্পূর্ণ করা যেতে পারে:

... অর্থাৎ,

5 6 5 1 6
4 8 7 6 2
5 7 7 7 3
2 4 8 8 6
4 1 3 4 3

বিশেষ উল্লেখ

  • ইনপুটটিতে সর্বদা কমপক্ষে এবং সর্বাধিক (খালি নয়) টাইল থাকবে, যেখানে ।1N22N7
  • টাইলগুলি প্রতিনিধিত্ব করতে আপনি কোনও মানের সেট ব্যবহার করতে পারেন, যতক্ষণ না এটি আপনার উত্তরে নির্দিষ্ট করা থাকে।
  • আপনার ইনপুট এবং আউটপুট যে কোনও ফর্ম্যাট এবং ক্রমে থাকতে পারে, যতক্ষণ না এটি আপনার উত্তরে নির্দিষ্ট করা থাকে।
  • কমপক্ষে একটি বৈধ সমাধান সমস্ত ইনপুটগুলির জন্য উপস্থিত থাকবে (যেমন আপনার অবৈধ ইনপুট হ্যান্ডেল করার দরকার নেই)।
  • স্ট্যান্ডার্ড আই / ও বিধি প্রযোজ্য।
  • স্ট্যান্ডার্ড লুফোলগুলি নিষিদ্ধ।
  • এমনকি "ব্যবহারিক" ভাষার জন্য ব্যাখ্যাগুলি উত্সাহিত করা হয়।

পরীক্ষার মামলা

ইনপুট ( Θ ):

0 6
0 0

আউটপুট ( Θ ):

5 6
4 3

ইনপুট ( Θ ):

5 6 5 6
4 0 3 2
5 7 6 2
4 3 4 3

আউটপুট ( Θ ):

5 6 5 6
4 8 3 2
5 7 6 2
4 3 4 3

ইনপুট ( Θ ):

5 0 0 0 6
0 0 7 0 0
0 0 0 0 3
2 4 0 0 0
0 0 3 0 0

আউটপুট ( Θ ):

5 6 5 1 6
4 8 7 6 2
5 7 7 7 3
2 4 8 8 6
4 1 3 4 3


1
@ আর্নাউল্ড আপনি সঠিক; এটি বৈধ নয় মায়ান্দার একক বন্ধ পথ।
জর্দান

1
@ আর্নল্ড ধন্যবাদ, আমি এই পরিবর্তন করেছি। আমি বুঝতে পারিনি যে ম্যাথজ্যাক্স এই সাইটে সক্ষম হয়েছিল!
জর্ডান

উত্তর:


11

জাভাস্ক্রিপ্ট (ES7),  236 ... 193  185 বাইট

ইনপুট ম্যাট্রিক্স পরিবর্তন করে আউটপুট।

m=>(g=(d,x,y,v,r=m[y],h=_=>++r[x]<9?g(d,x,y,v)||h():r[x]=0)=>r&&1/(n=r[x])?x|y|!v?n?g(d='21100--13203-32-21030321'[n*28+d*3+7&31],x+--d%2,y+--d%2,v+=n<7||.5):h():!m[v**.5|0]:0)(0,0,0,0)

এটি অনলাইন চেষ্টা করুন!

(ফলাফলকে ম্যাট্রিক্স হিসাবে এবং ওপি দ্বারা সরবরাহিত ভিজুয়ালাইজেশন সরঞ্জামের সাথে সামঞ্জস্যপূর্ণ একটি সমতল তালিকা হিসাবে উভয়ই প্রিন্ট করার জন্য কিছু পোস্ট-প্রসেসিং কোড অন্তর্ভুক্ত করা হয়েছে )

ফলাফল

কিভাবে?

ভেরিয়েবল

g হ'ল একটি পুনরাবৃত্ত ফাংশন যা বর্তমান দিক , বর্তমান স্থানাঙ্ক এবং পরিদর্শন করা ঘরের সংখ্যা ।d(x,y)v

নিম্নলিখিত পরিবর্তনশীলগুলিও এর স্কোপে সংজ্ঞায়িত করা হয় :g

  • r ম্যাট্রিক্সের বর্তমান সারি।

    r = m[y]
  • h একটি সহায়ক ফাংশন যা বর্তমান কক্ষের জন্য থেকে অবধি সমস্ত মান চেষ্টা করে এবং তাদের প্রত্যেকের সাথে আহ্বান করে। এটি হয় সফল হওয়ার সাথে সাথেই বন্ধ হয়ে যায় বা যদি আমাদের ব্যাকট্র্যাকের প্রয়োজন হয় তবে বর্তমান সেলটি ফিরে সেট করে ।18gg0

    h = _ => ++r[x] < 9 ? g(d, x, y, v) || h() : r[x] = 0

প্রাথমিক চেক

আমরা প্রথমে আমাদের বর্তমান অবস্থানটি বৈধ কিনা তা নিশ্চিত করি এবং আমরা বর্তমান কক্ষের মান লোড করি :n

r && 1 / (n = r[x]) ? ... ok ... : ... failed ...

আমরা আমাদের প্রথম অবস্থানে ফিরে এসেছি কিনা তা পরীক্ষা করি, যেমন আমরা এ অবস্থিত এবং আমরা কমপক্ষে কয়েকটি ঘর ( ) পরিদর্শন করেছি :(0,0)v>0

x | y | !v ? ... no ... : ... yes ...

আপাতত, ধরে নেওয়া যাক আমরা আরম্ভের বিন্দুতে ফিরে আসছি না।

পথ খুঁজছি

যদি সমান হয় , আমরা এই টাইলটির জন্য সমস্ত সম্ভাব্য মান চেষ্টা করার জন্য কে অনুরোধ করব।n0h

যদি সমান না হয় , আমরা পরবর্তী টাইলে যাওয়ার চেষ্টা করি।n0

টাইল সংযোগগুলি একটি অনুসন্ধানের টেবিলটিতে এনকোড করা হয়েছে, যার সূচকটি এবং সাথে গণনা করা হয়েছে এবং যার বৈধ এন্ট্রিগুলি নতুন মানগুলি উপস্থাপন করে ।ndd

d = '21100--13203-32-21030321'[n * 28 + d * 3 + 7 & 31]

সর্বশেষ 8 টি এন্ট্রি অবৈধ এবং বাদ দেওয়া আছে। অন্যান্য 4 টি অবৈধ এন্ট্রিগুলি হাইফেনের সাথে স্পষ্টভাবে চিহ্নিত করা হয়েছে।

রেফারেন্সের জন্য, নীচে ডিকোডেড টেবিল, চ্যালেঞ্জে প্রদত্ত কম্পাস এবং টাইলসেটটি দেওয়া হয়েছে:

   | 1 2 3 4 5 6 7 8
---+-----------------
 0 | 0 - - 1 3 - 3 1          1
 1 | - 1 - - 2 0 2 0        0 + 2
 2 | 2 - 1 - - 3 1 3          3
 3 | - 3 0 2 - - 0 2

আমরা নতুন দিক এবং নতুন স্থানাঙ্কগুলি সহ তে পুনরাবৃত্ত কল করি call আমরা যোগ থেকে যদি আমরা ধরনের টালি ছিল বা , অথবা অন্যথায় (পরের প্যারা দেখুন)।g1/2v781

g(d, x + --d % 2, y + --d % 2, v += n < 7 || .5)

যদি অবৈধ হয়, তবে এবং NaN তে সেট করা হবে , পরবর্তী পুনরাবৃত্তিটি অবিলম্বে ব্যর্থ হতে বাধ্য করবে।dxy

পথটি বৈধ করা হচ্ছে

অবশেষে, আমরা যখন দিয়ে ফিরে ফিরে আসি , এর অর্থ অগত্যা এই নয় যে আমরা একটি বৈধ পথ পেয়েছি, কারণ আমরা শর্টকাট নিয়েছি। আমাদের পরীক্ষা করা দরকার যে আমরা কোষের সঠিক সংখ্যাটি দেখেছি কিনা।(0,0)v>0

এবং টাইল বাদে প্রতিটি টাইল একবার অবশ্যই দেখতে হবে যা অবশ্যই দু'বার দেখতে হবে। এই কেন আমরা কেবল যোগ থেকে যখন যেমন একটি টালি পরিদর্শন করা হয়।781/2v

শেষ , আমাদের অবশ্যই । তবে এটিও লক্ষণীয় যে আমরা সম্ভবত । সুতরাং, এটা টেস্ট করার জন্য যথেষ্ট যে, আমরা না , বা যে ম্যাট্রিক্সের সারি (0-ইন্ডেক্স) বিদ্যমান নয়, যেখানে ।v=N2v>N2v<N2kk = √ √k=v

সুতরাং জেএস কোড:

!m[v ** .5 | 0]

ফর্ম্যাট উত্স

m => (
  g = (
    d,
    x, y,
    v,
    r = m[y],
    h = _ => ++r[x] < 9 ? g(d, x, y, v) || h() : r[x] = 0
  ) =>
    r && 1 / (n = r[x]) ?
      x | y | !v ?
        n ?
          g(
            d = '21100--13203-32-21030321'[n * 28 + d * 3 + 7 & 31],
            x + --d % 2,
            y + --d % 2,
            v += n < 7 || .5
          )
        :
          h()
      :
        !m[v ** .5 | 0]
    :
      0
)(0, 0, 0, 0)

চমৎকার কাজ. আমি কোডটির ব্যাখ্যাটি পড়তে পছন্দ করি।
জর্ডান

@ আরনল্ড আপনি কি নিষ্ঠুরভাবে চাপ দিচ্ছেন বা অন্য অ্যালগরিদম ব্যবহার করছেন?
জোনা

1
@ জোনাঃ আমি বর্তমানে একটি ব্যাখ্যা লিখছি। মূলত, হ্যাঁ, এটি একটি নিষ্ঠুর-শক্তি পদ্ধতির তবে প্রতিটি সম্ভাব্য বোর্ড চেষ্টা করার পরিবর্তে কিছুটা অসঙ্গতি সনাক্ত হওয়ার সাথে সাথে অ্যালগরিদম ব্যাকট্র্যাকগুলি।
আর্নৌল্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.