হারিয়ে যাওয়া পদ্মার সমস্যা


14

হারিয়ে যাওয়া পদ্মার সমস্যা

দাবা খেলা শেষ হওয়ার পরে, বেঁচে থাকা শৈশবকে শত্রু লাইনের পিছনে ফেলে রাখা হয়েছিল। আসুন তাকে বাড়ি ফেরার সবচেয়ে সংক্ষিপ্ততম উপায় খুঁজে পেতে সহায়তা করি।

মূল সমস্যাটি একটি এনএক্সএন "দাবা" বোর্ড এবং f: {1,..,n-1}X{1,..,n}X{-1,0,1} => R+ওজনের একটি ফাংশন বর্ণনা করে। লক্ষ্যটি হ'ল বাটম লাইনের কিছু বর্গক্ষেত্র থেকে শীর্ষ রেখার অন্য কোনও স্কোয়ারে যাওয়ার সর্বোত্তম পথ সন্ধান করা, যেখানে সম্ভাব্য পদক্ষেপগুলি রয়েছে: বাম-আপ, উপরে, ডান-আপ এবং আপনি বোর্ড থেকে প্রস্থান করতে পারবেন না।

গতিশীল প্রোগ্রামিং ব্যবহার করে O (n ^ 2) এ সমস্যাটি সমাধান করা তুলনামূলকভাবে সহজ, তবে এটি কোডগল্ফ এবং আমরা সময় বেঁধে চলমান জটিলতার মতো অকেজো জিনিসগুলির বিষয়ে চিন্তা করি না ...

সমস্যাটি

ইনপুট: একটি ত্রি-মাত্রিক অ্যারে (বা আপনার পছন্দসই কিছু অন্যান্য সংগ্রহ, স্ট্ডিনের মাধ্যমে প্রাপ্ত, বা একটি ফাংশন আর্গুমেন্ট হিসাবে), নিয়মিত দাবা বোর্ডের সাথে হুবহু আকারে: 7X8X3 (# লাইনপ্যাসেস এক্স # মরোজ সাইজ এক্স # মওভেসপাস) সমন্বিত অ-নেতিবাচক পূর্ণসংখ্যার প্যাচসমূহ খরচ থেকে কিছু অবস্থান (i,j)যেখানে iসারি সূচক, এবং jকলাম সূচক হয়, আছেন:

  • a[i][j][0]খরচ ভ্রমণ করতে স্কয়ার পর্যন্ত-বাম (i+1,j-1), অথবা গ্রাফিক্যালি: \
  • a[i][j][1]খরচ ভ্রমণ করতে স্কয়ার থেকে (i+1,j), অথবা গ্রাফিক্যালি: |
  • a[i][j][2]খরচ ভ্রমণ করতে জন্য আপ-ডান বর্গাকার করতে (i+1,j+1), অথবা গ্রাফিক্যালি: /

আপনি ধরে নিতে পারেন এটিতে এমন কোনও পথ থাকবে না যা তার চেয়ে বেশি পরিমাণের হবে MAX_INT

আউটপুট: একটি 8X8 এসকিআই আউটপুট সেরা (সংক্ষিপ্ততম, অর্থাৎ ওজনের সর্বনিম্ন যোগফল) পথ দেখায় (যদি 1 টিরও বেশি অনুকূল ফলাফল থাকে তবে আপনি আপনার পছন্দের একটি স্বেচ্ছাসেবক পথ প্রদর্শন করতে পারেন)। পাথ নীচে থেকে উপরে টানা হয়, যেখানে প্রতিটি লাইনে, পথের প্যাঁচার অবস্থানের সাথে সম্পর্কিত চরিত্রটিই এটি তৈরি করতে চলেছে। উদাহরণস্বরূপ, যদি প্যাডটি কলাম 3 (কলাম 2 এ) থেকে বাম দিকে উপরে যেতে চলেছে তবে আপনার আঁকতে হবে:

#?######
##\#####

যেখানে ?পরবর্তী পদক্ষেপের সাথে প্রতিস্থাপন করা উচিত। চূড়ান্ত অবস্থান হিসাবে আঁকা প্রয়োজন X

উদাহরণ

ইনপুট:

[
  [[1,1,1],[1,1,1],[0,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]],
  [[1,1,1],[1,0,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]],
  [[1,1,1],[1,1,0],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]],
  [[1,1,1],[1,1,1],[1,1,0],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]],
  [[1,1,1],[1,1,1],[1,1,1],[1,0,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]],
  [[1,1,1],[1,1,1],[1,1,1],[1,0,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]],
  [[1,1,1],[1,1,1],[1,1,1],[0,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]]
]

আউটপুট:

##X#####
###\####
###|####
###|####
##/#####
#/######
#|######
##\#####

ইনপুট:

[
  [[41,27,38],[12,83,32],[50,53,35],[46,32,26],[55,89,82],[75,30,87],[2,11,64],[8,55,22]],
  [[56,21,0],[83,25,38],[43,75,63],[56,60,77],[68,55,89],[99,48,67],[94,30,9],[62,62,58]],
  [[23,18,40],[24,47,61],[96,45,72],[71,6,48],[75,63,98],[93,56,51],[23,31,30],[49,34,99]],
  [[20,47,42],[62,79,72],[32,28,44],[68,61,55],[62,39,57],[4,17,49],[97,85,6],[91,18,12]],
  [[51,50,11],[32,39,56],[12,82,23],[33,88,87],[60,55,22],[29,78,14],[70,11,42],[63,94,67]],
  [[75,64,60],[27,79,86],[70,72,56],[55,45,32],[95,67,12],[87,93,98],[81,36,53],[38,22,93]],
  [[31,80,50],[77,71,22],[59,46,86],[64,71,53],[41,19,95],[62,71,22],[92,80,41],[26,74,29]]
]

আউটপুট:

######X#
#####/##
####/###
#####\##
#####|##
######\#
######|#
#######\

এটি , তাই সংক্ষিপ্ততম কোড জয়ী।

ন্যায্য খেলা. কোন ফাঁক নেই ...

সম্পাদনা করুন:

আইভি'র স্ক্যালায় আপনি লক্ষ্য রাখতে পারেন এমন একটি অ-গল্ফ করা সরাসরি এগিয়ে সমাধান লিখেছেন । অনলাইনে স্কাল কোড সহ আপনি খেলতে পারেন এমন একটি সাইটও রয়েছে : স্কালাকাটা ( স্ক্যালাকাটায় কেবল গিস্টটি অনুলিপি করুন এবং পেস্ট করুন এবং প্লে বোতামটি চাপুন)

উত্তর:


5

প্রশ্ন: 199 বাইট

f:{m::x;n::{@/[+/-1 0 1_\:/:(x;m[y;;|!3]);0 2;(0W,),{x,0W}]};i:*<*|r:{&/n[x;y]}\[8#0;!7];  s:{-1+{*<x}'+n[y;z]}\[();(,8#0),-1_r;!7];j:i,{x+y x}\[i;|s];-1(@[8#"#";;:;]'[j;"X","/|\\"1+s'[|!7;-1_j]]);}

মন্তব্য

  • কিউ ইন্টারপ্রেটার (কেএক্স.কম) অ-বাণিজ্যিক ব্যবহারের জন্য বিনামূল্যে (উইন্ডোজ, লিনাক্স, ম্যাকের সংস্করণ)
  • এই সমাধানে কিউ এর অভ্যন্তরীণ কোর ব্যবহার করা হয় (অভ্যন্তরীণভাবে নামযুক্ত কে 4), সুতরাং আমাদের কে এক্সটেনশন সহ একটি স্ক্রিপ্টিং ফাইল দরকার হবে বা কে মোডে ইন্টারেক্টিভ ইন্টারপ্রিটার (প্রথম প্রম্পটে \ কমান্ড)। বিপরীতে, ভাষার 'ভার্বোস' (সুগম) সংস্করণটির জন্য q এক্সটেনশন সহ স্ক্রিপ্টের প্রয়োজন হয় এবং এটি ইন্টারেক্টিভ ইন্টারপ্রেটারে ডিফল্ট মোড।

পরীক্ষা

f ((1 1 1; 1 1 1; 0 1 1; 1 1 1; 1 1 1; 1 1 1; 1 1 1; 1 1 1)
   (1 1 1; 1 0 1; 1 1 1; 1 1 1; 1 1 1; 1 1 1; 1 1 1; 1 1 1)
   (1 1 1; 1 1 0; 1 1 1; 1 1 1; 1 1 1; 1 1 1; 1 1 1; 1 1 1)
   (1 1 1; 1 1 1; 1 1 0; 1 1 1; 1 1 1; 1 1 1; 1 1 1; 1 1 1)
   (1 1 1; 1 1 1; 1 1 1; 1 0 1; 1 1 1; 1 1 1; 1 1 1; 1 1 1)
   (1 1 1; 1 1 1; 1 1 1; 1 0 1; 1 1 1; 1 1 1; 1 1 1; 1 1 1)
   (1 1 1; 1 1 1; 1 1 1; 0 1 1; 1 1 1; 1 1 1; 1 1 1; 1 1 1))

##X#####
###\####
###|####
###|####
##/#####
#/######
#|######
##\#####

f ((41 27 38; 12 83 32; 50 53 35; 46 32 26; 55 89 82; 75 30 87;  2 11 64;  8 55 22)
   (56 21  0; 83 25 38; 43 75 63; 56 60 77; 68 55 89; 99 48 67; 94 30  9; 62 62 58)
   (23 18 40; 24 47 61; 96 45 72; 71  6 48; 75 63 98; 93 56 51; 23 31 30; 49 34 99)
   (20 47 42; 62 79 72; 32 28 44; 68 61 55; 62 39 57;  4 17 49; 97 85  6; 91 18 12)
   (51 50 11; 32 39 56; 12 82 23; 33 88 87; 60 55 22; 29 78 14; 70 11 42; 63 94 67)
   (75 64 60; 27 79 86; 70 72 56; 55 45 32; 95 67 12; 87 93 98; 81 36 53; 38 22 93)
   (31 80 50; 77 71 22; 59 46 86; 64 71 53; 41 19 95; 62 71 22; 92 80 41; 26 74 29))

######X#
#####/##
####/###
#####\##
######\#
######|#
######|#
#######\

ব্যাখ্যা

ইলাস্ট্রেশন উদ্দেশ্যে, আমরা দ্বিতীয় পরীক্ষা গ্রহণ করি (ম্যাট্রিক্স ((41 27 38; 12 83 32; ....)

আমরা মূল ম্যাট্রিক্স (কোড স্তরে মি) রূপান্তর করি: প্রতিটি সমন্বয়ের জন্য ট্রিপলেট সহ অরগিনিমাল ম্যাট্রিকের পরিবর্তে, আমরা বাম, উপরে এবং ডান স্থানান্তরগুলির জন্য ম্যাট্রিক্স সংজ্ঞায়িত করি। বাম ম্যাট্রিক্সে 7x7 মান রয়েছে (আমরা প্রথম কলামটি ড্রপ করি), উপরে ম্যাট্রিক্স 7x8 এবং ডান ম্যাট্রিক্স 7x7 (আমরা শেষ কলামটি ফ্রুপ) করি।

left                           up                         right
12 50 46 55 75 2  8       27 83 53 32 89 30 11 55     38 32 35 26 82 87 64
83 43 56 68 99 94 62      21 25 75 60 55 48 30 62     0  38 63 77 89 67 9 
24 96 71 75 93 23 49      18 47 45 6  63 56 31 34     40 61 72 48 98 51 30
62 32 68 62 4  97 91      47 79 28 61 39 17 85 18     42 72 44 55 57 49 6 
32 12 33 60 29 70 63      50 39 82 88 55 78 11 94     11 56 23 87 22 14 42
27 70 55 95 87 81 38      64 79 72 45 67 93 36 22     60 86 56 32 12 98 53
77 59 64 41 62 92 26      80 71 46 71 19 71 80 74     50 22 86 53 95 22 41

চূড়ান্ত অবস্থান গণনা করতে আমাদের ন্যূনতম ব্যয়ের পথটি মূল্যায়ন করতে হবে। আমরা প্রাথমিক ব্যয় 0 0 0 0 0 0 0 0 0 (প্রথম সারির প্রতিটি কলামে পৌঁছানোর ব্যয়) গ্রহণ করি এবং প্রতিটি পরবর্তী সারিতে পুনরাবৃত্তি করি। প্রতিটি কলামে আমি তিনটি মান গণনা করি:

  • পূর্ববর্তী i + 1 মান প্লাস বাম [i + 1] এর ব্যয়। আমরা ব্যয়ের প্রথম উপাদান (শিফট এবং যোগ করার জন্য কলামগুলি alignates) এবং সংযোজন উপাদানকে সংযোজন করতে পারি

  • পূর্ববর্তী i মান প্লাস আপের ব্যয় [i]। আমরা উপাদানকে কম্পোনেন্ট যোগ করি

  • পূর্ববর্তী আই -1 মান প্লাস রাইট [i-1] এর ব্যয়। আমরা ব্যয়ের শেষ উপাদান (শিফট এবং যোগ করার জন্য কলামগুলি অ্যালিমেট করে) এবং সংযোজন উপাদানকে সংযোজন করি

ন্যূনতম গণনা করতে আমরা বাম খরচ প্রিফেন্ডিং অসীম এবং ডান ব্যয়কে অন্তর্ভুক্ত করি অসীম: আটটি উপাদানের 3 ভেক্টর সহ, সর্বনিম্ন উপাদানকে উপাদান থেকে গণনা করি। ফলাফলের মানটি নতুন পুনরাবৃত্তির জন্য বেস ব্যয়

প্রথম পুনরাবৃত্তির জন্য আমরা মানগুলি পাই (0W Q এ অসীম)

0W 12 50 46 55 75 2  8
27 83 53 32 89 30 11 55
38 32 35 26 82 87 64 0W

এবং প্রতিটি কলামের সর্বনিম্ন গণনা করে

27 12 35 26 55 30 2 8

সমস্ত পুনরাবৃত্তির পরে, আমাদের প্রতিটি স্কোয়ারে পৌঁছতে সর্বনিম্ন ব্যয় হবে (শীর্ষে সারি 0 ধরে, নীচে 7 ধরে)। আমরা কেবল সর্বশেষ কলামে আগ্রহী, তবে আমি শ্রুতিমধুর উদ্দেশ্যে সমস্ত মধ্যবর্তী ফলাফলগুলি আঁকছি

0   0   0   0   0   0   0   0
27  12  35  26  55  30  2   8
27  37  78  82  110 78  11  70
45  61  123 88  173 129 34  104
87  123 151 143 212 133 40  122
98  155 163 176 234 147 51  185
158 182 219 208 246 234 87  207
208 204 265 261 265 256 128 233

এখন আমরা সর্বশেষ সারিতে নূন্যতম মান পেয়েছি (128, কলাম 6 এ)। এটাই পথের শেষ (আউটপুটে এক্স অক্ষর)।

আমরা পুনরায় ব্যয়ের গণনার পুনরাবৃত্তি করি, তবে এখন আমরা প্রতিটি ন্যূনতম প্রাপ্ত দিকটি বর্ণনা করি (ন্যূনতম গণনা করতে ব্যবহৃত 3 টি মানগুলির মধ্যে নির্বাচিত মানটি হয়)।

\|/|\///
\\\\\/|/
\\\|//|/
\\|\//|/
\\|//|\/
\\//|\|/
\|/|/|\/

আমরা সারিগুলি বিপরীত করি, pos নম্বরে 'এক্স' রেখেছি এবং কেবল কলাম 6 এ শেষ হওয়া পথটি সংরক্ষণ করি (অন্যরা # দ্বারা প্রতিস্থাপিত হয়)

######X#
#####/##
####/###
#####\##
######\#
######|#
######|#
#######\

আইভি'ই কখনো কিউ এর কথা শুনেনি, তবে এই জাতীয় প্রতিক্রিয়াটির জন্য ধন্যবাদ :)
গিলাদ হচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.