ফ্রগার চ্যাম্পিয়ন


11

খেলাাটি

আমরা বেশিরভাগই ফ্রোগার , 80 এর দশকের আরকেড খেলা সম্পর্কে জানি যেখানে উদ্দেশ্য ছিল ব্যস্ত মহাসড়ক জুড়ে নিরাপদে একটি ব্যাঙ এবং বাড়িতে ঝুঁকিতে ভরা পুকুরটি নিরাপদে বাড়িতে পৌঁছানো hop

ফ্রোগার ক্লোন বিকাশের জন্য কয়েক মাস আগে একটি চ্যালেঞ্জ জারি করা হয়েছিল । আপনি কেন ফ্রোগার খেলতে পারবেন তবে কেন ক্লোন ফ্রোগার? :)

নিম্নলিখিত সরলীকৃত প্লেড গ্রিড বিবেচনা করুন:

 XXXXXXXXXXXXXXXXXXXXXXX  North Safe Zone
 -----------------------
|                       | <<<<       Express Lane West        (Lane 1)
|                       |     >      Gridlock East            (Lane 2)
|                       |   <<       Freeflowing Traffic West (Lane 3)
|                       |    <       Gridlock West            (Lane 4)
|                       |     >>>>   Express Lane East        (Lane 5)
 -----------------------
 XXXXXXXXXXX@XXXXXXXXXXX  South Safe Zone
 \__________ __________/
            '
  23 cells horizontally

আমাদের ট্র্যাফিকের পাঁচটি লেন রয়েছে, প্রতিটি 23 টির মতো প্রশস্ত চওড়া অঞ্চল এবং দুটি নিরাপদ অঞ্চল (যেখানে ব্যাঙটি নিরাপদে বাম এবং ডান স্থানান্তর করতে পারে), এছাড়াও 23 কোষ প্রশস্ত। আপনি ডান এবং বাম সীমানাগুলি অগ্রাহ্য করতে পারেন কারণ এটি চিত্রের স্বচ্ছতার জন্য।

আমাদের ব্যাঙটি দক্ষিণের নিরাপদ জোনে, কেন্দ্রের (দ্বাদশ) কোষে শুরু হয়, যেমন @উপরের চিত্রটিতে একটি দ্বারা নির্দেশিত ।

গেমের সময়কে ফ্রেম বলে আলাদা পদক্ষেপে বিভক্ত করা হয়। ব্যাঙি একটি দ্রুত ব্যাঙ এবং ফ্রেম প্রতি যে কোনও দিকের (উপরে, নীচে, ডান, বাম) একটি কক্ষকে হপ করতে পারে। তিনি যে কোনও ফ্রেমের জন্য স্থির থাকতেও বেছে নিতে পারেন। পাঁচটি লেনের ট্রাফিক নিয়মিত গতিবেগে নিম্নরূপে চলে:

  • এক্সপ্রেস লেনের পশ্চিমের ট্রেন (লেন 1) প্রতিটি ফ্রেম ছেড়ে 2 টি ঘর সরিয়ে নিয়ে যায়
  • গ্রিডলক পূর্ব লেনের ট্রেন (লেন 2) প্রতি দ্বিতীয় ফ্রেমে ডানদিকে 1 কক্ষটি সরায়
  • ফ্রিফ্লোটিং ট্র্যাফিক ওয়েস্ট লেনের ট্রেন (লেন 3) প্রতিটি ফ্রেম 1 টি সেল রেখে দেয়
  • গ্রিডলক ওয়েস্ট লেনের ট্রেন (লেন 4) প্রতি দ্বিতীয় ফ্রেমে 1 সেল বামে সরানো হয়
  • এক্সপ্রেস লেনের পূর্ব দিকে (লেন 5) ট্র্যাফিক প্রতিটি ফ্রেমের ডানদিকে 2 টি কক্ষ সরায়

ট্র্যাফিক নিজেই প্রায় আনুমানিক জন্য সংজ্ঞায়িত করা হয়। এই পাঠ্য ফাইলে 3,000 টাইমস্টেপ । 'ট্র্যাফিক' যানবাহন এবং যানবাহনের মধ্যে স্পেস নিয়ে গঠিত। কোনও অক্ষর যা কোনও স্থান নয় এটি একটি গাড়ির অংশ। পাঠ্য ফাইলটিতে ট্র্যাফিকের পাঁচটি লেনের (একই ক্রম সহ) অনুরূপ পাঁচটি লাইন রয়েছে।

ওয়েস্টবাউন্ড লেনগুলির জন্য, ফ্রেম 0 (খেলার শুরু) এর শুরুতে, আমরা লেনের প্রথম যানটিকে প্লেিং গ্রিডের ডান প্রান্তের বাইরে বলে মনে করি।

পূর্ব দিকের লেনগুলির জন্য, ট্র্যাফিকের স্ট্রিংটিকে "পিছনের দিকে" বিবেচনা করা উচিত যাতে বোঝা যায় যে যানগুলি স্ট্রিংয়ের শেষে শুরু হয় । ফ্রেম 0 এর শুরুতে, আমরা এই লেনের প্রথম যানটিকে খেলার মাঠের বাম প্রান্তের বাইরে বলে মনে করি।

উদাহরণ হিসাবে বিবেচনা করুন:

Traffic Lane 1:  [|==|  =
Traffic Lane 2:  |) =  o
Traffic Lane 3:  (|[]-[]:
Traffic Lane 4:  <| (oo|
Traffic Lane 5:  |==|] :=)

তারপরে প্লেিং গ্রিডটি নীচে প্রদর্শিত হবে:

Start of Frame 0       XXXXXXXXXXXXXXXXXXXXXXX
                                              [|==|  =
                |) =  o
                                              (|[]-[]:
                                              <| (oo|
              |==|] :=)
                       XXXXXXXXXXXXXXXXXXXXXXX

Start of Frame 1       XXXXXXXXXXXXXXXXXXXXXXX
                                            [|==|  =
                |) =  o
                                             (|[]-[]:
                                              <| (oo|
                |==|] :=)
                       XXXXXXXXXXXXXXXXXXXXXXX

Start of Frame 2       XXXXXXXXXXXXXXXXXXXXXXX
                                          [|==|  =
                 |) =  o
                                            (|[]-[]:
                                             <| (oo|
                  |==|] :=)
                       XXXXXXXXXXXXXXXXXXXXXXX

Start of Frame 3       XXXXXXXXXXXXXXXXXXXXXXX
                                        [|==|  =
                 |) =  o
                                           (|[]-[]:
                                             <| (oo|
                    |==|] :=)
                       XXXXXXXXXXXXXXXXXXXXXXX

একটি গলির সমস্ত ট্র্যাফিক "অবসন্ন" হওয়ার পরে (অর্থাত্ স্ট্রিং ফুরিয়ে যায়), আমরা স্ট্রিংয়ের সমস্ত অক্ষরকে ফাঁকা স্থান হিসাবে বিবেচনা করি।

আমাদের ব্যাঙ নীচে থেকে যদি কিছু ঘটে থাকে তবে তা স্কুইচ করা হয়:

  • ব্যাঙটি কোনও ফ্রেমে কোনও যানবাহনের দ্বারা দখল করা একটি ঘর দখল করে
  • ব্যাঙটি একটি এক্সপ্রেস লেনে স্থির থাকে এবং 1 ফ্রেমের প্রস্থের একটি গাড়ি তার ফ্রেমে তার উপর দিয়ে যায়
  • ব্যাঙটি পশ্চিমে যানবাহনটি "পেরিয়ে" পূর্ব দিকে ঝাঁপিয়ে পড়ে, বা পূর্ব দিকে যেতে কোনও যানবাহন দিয়ে পশ্চিমে লাফ দেয়
  • ব্যাঙ যে ​​কোনও ফ্রেমে 23 (সেল) গ্রিড প্লে করে 7 (লাইন) এর বাইরে লাফ দেয়

নোট করুন যে এগুলি একমাত্র শর্ত যার অধীনে একটি ব্যাঙ স্কুয়েশ। বিশেষত, ট্র্যাফিকের সাথে "পাশাপাশি" হাঁপানো ব্যাঙ জায়েজ, যেমন একটি ব্যাঙ একই ফ্রেমের প্রস্থ -১ যানবাহন দিয়ে একটি এক্সপ্রেস লেনের একটি ঘরে প্রবেশ করে বা তার বাইরে বেরিয়ে যায়।

উদ্দেশ্য এবং স্কোরিং

প্রোগ্রামিং চ্যালেঞ্জের উদ্দেশ্যটি হ'ল শেষ বাহনটি প্লেিং গ্রিড থেকে বের হওয়ার আগে রাস্তাটি যতবার সম্ভব পারাপার করা । এটি হ'ল, ফ্রেম এক্স সমাপ্তির সাথে সাথে প্রোগ্রামটি সমাপ্ত হয় , যেখানে ফ্রেম এক্স হ'ল প্রথম ফ্রেম যা গ্রিডটিকে এমন অবস্থায় নিয়ে যায় যেখানে আর কোনও যানবাহন উপস্থিত নেই।

আপনার প্রোগ্রামের আউটপুটটি একটি স্ট্রিং (বা পাঠ্য ফাইল) হওয়া উচিত যা নিম্নলিখিত এনকোডিংটি ব্যবহার করে ব্যাঙের চলার ক্রম যুক্ত থাকে:

<   frog moves left
>   frog moves right
^   frog moves up
v   frog moves down
.   frog remains stationary

উদাহরণস্বরূপ, স্ট্রিংটি <<^.^ইঙ্গিত দেয় যে ব্যাঙটি দু'বার বাম দিকে চলে যায়, তারপরে এবং তারপরে একটি ফ্রেমের জন্য বিরতি দেয়, তারপরে আবার উপরে চলে যায়।

যখনই ব্যাঙ দক্ষিণ নিরাপদ অঞ্চল থেকে উত্তর নিরাপদ অঞ্চলে চলে যায় তখন একটি পয়েন্ট তৈরি হয় এবং যখনই ব্যাঙ উত্তর নিরাপদ অঞ্চল থেকে দক্ষিণ নিরাপদ অঞ্চলে চলে যায় তখন একটি পয়েন্ট তৈরি হয়।

কিছু গুরুত্বপূর্ণ নিয়ম:

  1. ব্যাঙ অবশ্যই স্কোয়েশ করা উচিত নয়।
  2. আপনার প্রোগ্রাম কোড সহ আপনার সমাধান (চলার ক্রম) পোস্ট করুন, হয় ইনলাইন অথবা কোনও পাঠ্য ফাইল (যেমন পেস্টবিন.কম ব্যবহার করে)।
  3. আমাদের ব্যাঙ প্রাকৃতিক এবং পূর্বনির্ধারিত, তাই আপনার প্রোগ্রামটি সমাধানগুলি সন্ধানের সময় যে কোনও ফ্রেমে যে কোনও এবং সমস্ত ট্র্যাফিক ডেটা ব্যবহার করতে পারে । এটি ট্র্যাফিকের জন্য ডেটা অন্তর্ভুক্ত করে যা এখনও প্লেিং গ্রিডে পৌঁছায় না।
  4. গ্রিড চারপাশে মোড়ানো না। গ্রিডটি থেকে বেরিয়ে আসার ফলে ব্যাঙটি বাদ যাবে এবং তাই এটি অনুমোদিত নয়।
  5. কোনও পর্যায়ে ট্র্যাফিক "রিসেট" বা ব্যাঙ "টেলিপোর্ট" করে না। সিমুলেশন অবিচ্ছিন্ন হয়।
  6. ব্যাঙটি প্রস্থান করার পরে দক্ষিণ নিরাপদ অঞ্চলে ফিরে আসতে পারে, তবে এটি বিন্দু হিসাবে গণনা করা হয় না। একইভাবে উত্তর নিরাপদ অঞ্চলের জন্য।
  7. প্রতিযোগিতায় বিজয়ী হ'ল এমন প্রোগ্রাম যা সর্বাধিক সংখ্যক ক্রসিংয়ের ফলন করে এমন ক্রম উত্পন্ন করে।
  8. যে কোনও অতিরিক্ত প্রশ্ন বা উদ্বেগের জন্য, দয়া করে মন্তব্য বিভাগে নির্দ্বিধায় জিজ্ঞাসা করুন।

কিছু যুক্ত উত্সাহের জন্য, আমি যখন এটি করতে সক্ষম হব তখন আমি বিজয়ী প্রোগ্রামে +100 প্রতিনিধিত্বের একটি অনুগ্রহ যুক্ত করব ।

বোনাসেস

প্লেিং গ্রিডের প্রতিটি কোণার জন্য বেস স্কোর + (2.5% পর্যন্ত + 10%) ব্যাঙের ছোঁয়া। গ্রিডের চারটি কোণ দুটি নিরাপদ অঞ্চলের সবচেয়ে বাম এবং ডানদিকে কোষ।

বেস স্কোরে + 25% * যদি আপনার চলার ক্রমটি পুরো সিমুলেশনের জন্য ব্যাঙকে তার প্রারম্ভিক ঘরের বাম বা ডানদিকে +/- 4 কোষের মধ্যে সীমাবদ্ধ রাখে (তিনি অবশ্যই নিখরচায় উল্লম্বভাবে চলাচল করতে পারেন)।

কোনও স্কোরিং বোনাস নয়, তবে ওপিতে বিশেষ প্রপসগুলি যে কেউ দ্রুত এন 'নোংরা সমাধান বৈধকরণকারী পোস্ট করবেন যাতে আমার কোনও প্রোগ্রাম না করতে হয়। ;) একজন বৈধ লেখক কেবল চলার ক্রমগুলি গ্রহণ করবেন, এর বৈধতা (নিয়ম এবং ট্র্যাফিক ফাইল অনুযায়ী) নিশ্চিত করবেন এবং তার স্কোরটি (অর্থাৎ ক্রসিংয়ের মোট সংখ্যা) প্রতিবেদন করবেন।

* মোট স্কোরটি বেস স্কোর প্লাস বোনাসের সমান, নিকটতম পূর্ণসংখ্যকে গোল করে।

শুভকামনা ব্যাঙ!


যে কেউ সমাধান বৈধকারক পোস্ট করতে চান: দয়া করে এটি উত্তর হিসাবে পোস্ট করবেন না
Geobits

প্রকৃতপক্ষে. একটি মন্তব্যে কোডের একটি লিঙ্ক, বা কোনও সমাধানের সংযোজন হিসাবে, কোনও বৈধকরণকারীর জমা দেওয়ার পছন্দের উপায়।
কোতো

যে ধরণের ধীরে ধীরে লেন অগ্রসর হবে সেখানে প্রথম ফ্রেমের সাথে অন্য লেনগুলি অগ্রসর হয়, বা একটি ফ্রেম পরে যাবে?
শুক্রবার

এছাড়াও, প্রথম ফ্রেমে যে সমস্ত গাড়ি ক্ষেত্রটি সাফ করে দিয়েছে, সেখানে এন্ডজোন পৌঁছে দিয়ে স্কোর করা কি সম্ভব?
শুক্রবার

@ ফেয়ারসাম: ধীর গতির এক ফ্রেম পরে অগ্রসর হয়। উদাহরণস্বরূপ নির্দেশিত হিসাবে এগুলি একেবারে প্রথম ফ্রেমে স্থির থাকে। খুব শেষ ফ্রেমে ব্যাঙের স্কোরিংয়ের ক্ষেত্রে: হ্যাঁ, এটি সম্ভব is ব্যাঙটি যদি একই ফ্রেমের একটি নিরাপদ জোনে চলে যায় যে শেষ বাহনটি খেলার ক্ষেত্রটি থেকে বেরিয়ে আসে তবে একটি পয়েন্ট স্কোর হয়।
COTO

উত্তর:


5

সি ++: 176

আউটপুট:

176
^^^^^^>vvvvvv>^^^^>^^>>>>>>><<<.vv>v<<<.vvv<<<<<<^.^.^.^.>.>^^<.>>>>>>v>v>.>v<<<<v.<.vv<<<<<^^.<^<<<<<<^.^^>>>>vv>.>.v<v.vv>>^>>^<^<<<<<<<^>.>^^<<<.>>>>>vv>v<vvv<<<<<^^.<^^^^.....vv>.>.>.>v<<vvv<<>>>>^>^<.<.^^>^^>>>>vv.>v<vv.v^>^<.<.<^<^>.>^^>>>>vv.v<<<<<<.vvv<<<<^^^<<v^^.>.^^..>>>>>>vv>.>.v.vvv>>>^>^^<<<<<<<<<^>.>^^>>>>vvv<<v.<.vv<<<<<<>>>>>^^^<<<^^^<<>>vv>.v<<>vvv<<><>>>>>>>^>^^<^^^<.>>>>>>>>vv>.>v<<<vvv<<<<<^^^<<v.<.<^<<^.^<<^...>>>>>>>>>>>>>vv>v<vvv<<<<<<<<^>^.<.^^>.>^^<<<<<<<..>>>>vv>.vvvv<<<<>^.v>>>^^.^^>^<^<>>>>>>>>>vv>vvvv<<<<^^^<^>^<<^.>>vv>v<vvv<<<<<<<>>>>>>>^>^^^.^^>>>>>vvv<<vvv<<<^^^^^^<vvv<<<<<<<vvv<<<>>>>>>>>^^.<.<.^.^.^<^<>>>>>>>>>>vvv<<.vvv<<<^^<^<<^^<<^<<<>>>>vv>.vvvv>>^>>^<.<.<^<<<<<.^^<<^.......>vv.>.>.>v<vvv>>>>>>^>^.<.<^<.^^^<.>>>>>>>vvv<<<v.<vv<<<^^<.<.<.<^<<<^>^^..........v<vvvv>v>>>>>^>>^^^>^^>>>vv>v<vvv<<<<<<<<>^^.<.<^<^^^<.........>vv.>.vvvv>>>>^^<.<.<^^^<^<<.v<v>.>.>.>.>.>.>.vvv.v<<<<<^^<^<^>.>.>.>.^<^.>>>>>>>>vv>v<<vvv<<>>>>>^^^.^.>^<^<<<<<<<<.vv.>.v<<<.vvv<>>>>>^>^.<.<.<.<^^.^<<^<.....>>vvv<.>>vvv<<<>>>>>>>>^^^<<<.^.>.>^^.>>>>>vv.>v<vvv<<<>>>>>>^>^<^<<^.^^<vvv<<<<<vv.v<>>>>>>>>>>^>^.^^>^^<<<<.>vv.>.vvvv>^>>^.<.<.<^<<<^>^^>>>vv>v<<<<<vvv<<<>>>>>^^<.<.<.<.<^<^>.^^.>>>>>vv>v<>vvv<<<<<<<^>^.<^<<<<<<<^^^.>>>>>vv>v<>vvv>>>^^<.<^<<<^>^^.>>>>vv>.v<<vvv<<<<<^^^<<<<<^>.^^<>>>>>>>vv>.>v<<vvv<<<<<<<>>>^>>.>^^^.>^^<>>>>>>vv>vv.<.<.vv>>>>^^<.<.<.<^<<^.>^^.>>>>>vv.>.>v<<vvv<<>>>>>^^<.<.<.^^>.>.>^^<<<<<<<<.>>>>>>vv>v<<v.<.<vv<<<<^^.<^<<<.^^^<.vv.>v<vvv<<<>>>>>>^>^<^<<^.^<^<<.>>vv>.>.>.>vvvv>>>>>>^>^^^^^<<<.vvv<<<<<<vvv>>>>>^>^<.<^<<^.>.>.^^>>>>vv>.>v<<<<<<vvv<<<<^^^<.^.>^^>>>>vvv<<v.vv<<<^>>^^<<<.^^<<^>>>>>>>>>vvv.v.vv<>>>>>^>^^<<<<<<<<<<<<<<<<^^^..>>>>>vv>.>.>.>v<<v.<.<.vv<<<<<^^^<^>.^^...>>>>>>>>vv.v<.vvv>>>^>^<.<^^^^>>>vv>v<<<vvv<<<<>>>>>>^>^.<.<^<^>.>^^.>>>>>vv.v<<<<<<<<vvv<<<<^^<^<<<<<><^>.>^^>>>>vv.>.>.vvv.v>>>>>>>^^<.<^<<^^^>>>vv>.>.>.>.>v<<v.<.<vv>>>>^^^<<<<<.^.>^^>>>vv>.>v<vvv<<<<^^<.<.<.^^>^^>>>vv>.>.v<<<v.<vv<<<<^^.<^<<<^^^>>>>vvvvvv<<<<<<<<>^^.^>>^^^<>>>>>>>vvv<<<v.vv>>>>>^>>^^<<<<<^>.^^>>>>vv>.>v<<<<vvv<<<^^<.<.<.<^<<<<<^>^^>>>>vv.>vv.v.v<^>.>^.<.^^^^>>>>vv>.>.>.v<<<<<<vvv>>>>^^<.<.<^<<^^<^>>>>>>vv>v<<.vvv^>^^<<<^>^^<<<<<<.vvv<<vv>.v>>>>>>^>.>^^<<<<<^>.>.>.>.>.^^>>>>vv>.>.>v<<<<<vvv<<<<^^<^<<^.^^>>>>vv>.>.>.>v<vvv<<<<<^^.<.<^<<^^^>>>>>>>>>>>vv>.>.>.>.>vvvv<<<<^^.<.<^<^^^<<<<<<vvv<v.<vv<<<<^v>>>>>>>>>>^^^<.^.>.>.^^>>>>vvv<<<<<<<vvv<<<<<<<>^^.<^<.^^^.>>>>vv>v<vvv<>>>>^^.<.^.^.>.^<^>>>>>>>>vvvv.<.<vv<<<<^^^<<<<<^>.^^<.vv>.v<<vvv<<><>>>>>^>>^.<^<^^^<<<.>>vv>.>v<<<<v.vv>^>>^.<^^.^^.>>>>>vv>.>.>.v<v.<vv<<<<<^.^^^.>^^<>>>>>>vv>.v<<<v.<vv<<<<>>>>>>>>>>>^^<.<.<.<.<^<<^^<^<<<>>>>>>>vv>v<<<vv.v>>>>>>>>^>^<.<^<<<<<<<<<<<.^.>^^<<<vvv.v.<vv<<<^.>>^.<^^.>.>^^<<......vv.v>vvv>>>^.v^>>^^<<^^^<.>>>>>>>vvv<v.<.<.vv<<<<^^<.<.<.^^^^<.>>>>>>>>vvv<v.<vv^.>^^<<^^^vv>vvvv^>>>>>>>^^^^^vvvvvv^^^^^^vvvvvv>>>>

এখানে 8 মিলিয়ন রাষ্ট্রের নীচে পর্যালোচনা করা কোণগুলির এক্স টাইম এক্স সেট পজিশনের সংমিশ্রণ রয়েছে, সুতরাং তারা 1 সেকেন্ডেরও কম সময়ে নিখুঁতভাবে অনুসন্ধান করা যেতে পারে। কোডটিতে কোনও বাগ নেই, তবে এটি বীট করা অসম্ভব। সর্বোত্তম কৌশলটি ছিল পুরো বোর্ডটি ব্যবহার করার জন্য, যেহেতু কেন্দ্রে সীমাবদ্ধ থাকাকালীন প্রায় 120 এর বিপরীতে ব্যাঙটি 160 বার রাস্তাটি অতিক্রম করতে পারে। ট্র্যাফিক এত ভারী হওয়ার কারণে কোণগুলি ঘুরে দেখার কোনও ক্রসিংয়ের জন্য কোনও খরচ হয়নি।

/* feersum  2014/9
 /codegolf/37975/frogger-champion */

#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include <cstring>

#define B(F, CST, X, Y) best[ ((F)*NCST + (CST)) * BS + (Xmax-Xmin+1) * ((Y)-Ymin) + (X)-Xmin]
#define TL(i) ((int)t[i].length())
#define ABSPEED(I) (speed[i]<0?-speed[i]:speed[i])
#define errr(X) { cout<<"ERROR!!!!!!!!"; return X; }

#define DRAW 0
#if DRAW
    #include <unistd.h>
#endif


using namespace std;

int bc(int cs) {
    int c = 0;
    while(cs) {
        c += cs&1;
        cs >>= 1;
    }
    return c;
}

int main()
{
    const bool bonusTwentyfive = false;
    const int COLS = 23, T_ROWS = 5, YGS = T_ROWS + 2, XGS = COLS + 2;
    string t[5];
    int speed[] = {-4, 1, -2, -1, 4};
    ifstream f("t.txt");
    for(int i = 0; i < T_ROWS; i++)
        getline(f, t[i]);
    if(f.fail())
        return 1;
    f.close();
//for(int i = 0; i < 5; i ++)t[i]="xxx";

    char g[XGS][YGS];

    int mov[][3] = { {-1,  0, '<'},
                     {+1,  0, '>'},
                     { 0, -1, '^'},
                     { 0, +1, 'v'},
                     { 0,  0, '.'} };


    int Ymin = 0, Ymax = YGS-1;


    const int Xstart = 11, Xmaxmove = bonusTwentyfive ? 4 : 10;
    const int Xmin = Xstart - Xmaxmove, Xmax = Xstart + Xmaxmove;

    const int NCST = bonusTwentyfive ? 1 : 1<<4;

    int maxfr = 0;
    for(int i = 0; i < T_ROWS; i++) {
        if(speed[i] < 0) {
            for(int m = 0, n = t[i].length()-1; m < n; ++m,--n)
                swap(t[i][m], t[i][n]);
        }
        int carslen = TL(i);
        for(char*c = &t[i][speed[i]>0?TL(i)-1:0]; carslen; carslen--, speed[i]>0?--c:++c)
            if(*c != ' ')
                break;
        if(carslen)
            maxfr = max(maxfr, ( (carslen + COLS) * 2 + ABSPEED(i)-1 ) / ABSPEED(i));
    }
    const int BS = (Xmax-Xmin+1)*(Ymax-Ymin+1);
    int *best = new int[(maxfr+1)*NCST*BS];
    memset(best, 0xFF, (maxfr+1)*NCST*BS*sizeof(int));
    memset(g, ' ', sizeof(g));
    B(0, 0, Xstart, Ymax) = 0;

    for(int fr = 0; fr < maxfr; fr++) {
        for(int r = 0; r < T_ROWS; r++) {
            for(int x = 0; x < XGS; x++) {
                int ind = speed[r] > 0 ? TL(r)-1 + x - fr*speed[r]/2 : x - (XGS-1) - fr*speed[r]/2;
                g[x][r+1] = ind >= 0 && ind < TL(r) ? t[r][ind] : ' ';
            }
        }
        for(int x = Xmin; x <= Xmax; x++) {
            for(int y = Ymin; y <= Ymax; y++) {
                if(g[x][y] != ' ')
                    continue;
                for(unsigned m = 0; m < sizeof(mov)/sizeof(mov[0]); m++) {
                    int X = x + mov[m][0], Y = y + mov[m][1];
                    if(X < Xmin || X > Xmax || Y < Ymin || Y > Ymax)
                        continue;
                    if(!(mov[m][0]|mov[m][1]) && y > 0 && y > T_ROWS && g[x][y-speed[y-1]/4] != ' ')
                        continue;

                    int csor = ((X==Xmin|X==Xmax)&(Y==Ymin|Y==Ymax)&!bonusTwentyfive) << ((X==Xmax) + 2*(Y==Ymax));

                    for(int cs = 0; cs < NCST; cs++) {
                        int N = B(fr, cs, x, y);
                        if(!~N)
                            continue;
                        if((!(N&1) && y == 1 && Y == 0) ||
                              (N&1 && y == T_ROWS && Y == T_ROWS+1))
                            ++N;
                        if(N > B(fr+1, cs|csor, X, Y))
                            B(fr+1, cs|csor, X, Y) = N;
                    }


                }
            }
        }
    }

    int score = 0, xb, yb, cb, nb;
    for(int x = Xmin; x <= Xmax; x++) {
        for(int y = Ymin; y <= Ymax; y++) {
            for(int cs = 0; cs < NCST; cs++) {
                if(B(maxfr, cs, x, y) * (40 + bc(cs)) / 40 >= score) {
                    score = B(maxfr, cs, x, y) * (40 + bc(cs)) / 40;
                    xb = x, yb = y, cb = cs, nb = B(maxfr, cs, x, y);
                }
            }
        }
    }
    char *mvs = new char[maxfr+1];
    mvs[maxfr] = 0;

    for(int fr = maxfr-1; fr >= 0; --fr) {
        for(int r = 0; r < T_ROWS; r++) {
            for(int x = 0; x < XGS; x++) {
                int ind = speed[r] > 0 ? TL(r)-1 + x - fr*speed[r]/2 : x - (XGS-1) - fr*speed[r]/2;
                g[x][r+1] = ind >= 0 && ind < TL(r) ? t[r][ind] : ' ';
            }
        }
        for(int x = Xmin; x <= Xmax; x++) {
            for(int y = Ymin; y <= Ymax; y++) {
                if(g[x][y] != ' ')
                    continue;

                for(unsigned m = 0; m < sizeof(mov)/sizeof(mov[0]); m++) {
                    int X = x + mov[m][0], Y = y + mov[m][1];
                    if(X < Xmin || X > Xmax || Y < Ymin || Y > Ymax)
                        continue;
                    if(!(mov[m][0]|mov[m][1]) && y > 0 && y > T_ROWS && g[x][y-speed[y-1]/4] != ' ')
                        continue;

                    int csor = ((X==Xmin|X==Xmax)&(Y==Ymin|Y==Ymax)&!bonusTwentyfive) << ((X==Xmax) + 2*(Y==Ymax));

                    for(int cs = 0; cs < NCST; cs++) {
                        int N = B(fr, cs, x, y);
                        if(!~N)
                            continue;
                        if((!(N&1) && y == 1 && Y == 0) ||
                              (N&1 && y == T_ROWS && Y == T_ROWS+1))
                            ++N;
                        if(X==xb && Y==yb && N == nb && (cs|csor) == cb) {
                            mvs[fr] = mov[m][2];
                            xb = x, yb = y, nb = B(fr, cs, x, y), cb = cs;
                            goto fr_next;
                        }
                    }
                }
            }
        }
        errr(3623);
        fr_next:;
    }

    if((xb-Xstart)|(yb-Ymax)|nb)
        errr(789);
    #if DRAW

        for(int fr = 0; fr <= maxfr; ++fr) {
            memset(g, ' ', sizeof(g));
            for(int r = 0; r < T_ROWS; r++) {
                for(int x = 0; x < XGS; x++) {
                    int ind = speed[r] > 0 ? TL(r)-1 + x - fr*speed[r]/2 : x - (XGS-1) - fr*speed[r]/2;
                    ind >= 0 && ind < TL(r) ? g[x][r+1] = t[r][ind] : ' ';
                }
            }
            g[xb][yb] = 'F';
            for(int y = 0; y < YGS; y++) {
                for(int x = 0; x < XGS; x++)
                    cout<<g[x][y];
                cout<<endl;
            }
            cout<<string(XGS,'-')<<endl;
            usleep(55*1000);
            for(int i = 0; i < 5; i++) {
                if(mvs[fr] == mov[i][2]) {
                    xb += mov[i][0];
                    yb += mov[i][1];
                    break;
                }
            }
        }

    #endif
    cout<<score<<endl;
    cout<<mvs<<endl;
}

1
আপনি কীভাবে "রাজ্যগুলি" সংজ্ঞায়িত করছেন তা আমি নিশ্চিত নই। আমরা যদি সিস্টেমের স্থিতিকে ব্যাঙের গতির টাইম প্রোফাইল হিসাবে বিবেচনা করি তবে প্রায় 5 ^ 3000 রাজ্য রয়েছে, 5 ^ 3000 সম্ভাব্য ইনপুটগুলির জন্য গতি প্রোফাইলের সাথে সম্পর্কিত (~ 3000 ফ্রেমে প্রতি পাঁচটি সম্ভাব্য ইনপুট)। স্পষ্টতই এগুলির একটি ভগ্নাংশই গ্রহণযোগ্য হবে, তবে গ্রহণযোগ্য রাষ্ট্রগুলির সংখ্যা বহু শতাধিক আকারের দ্বারা অনুসন্ধান করা অসম্ভব। আপনি যখন আপনার চূড়ান্ত উত্তর জমা দেবেন, দয়া করে এটির সাথে চলার একটি তালিকা জমা দিন submit
COTO

এছাড়াও, যদি এটি পরিষ্কার না হয় তবে নোট করুন যে ব্যাঙটি ট্র্যাফিক চলাকালীন বাম এবং ডানে লাফিয়ে উঠতে পারে , যতক্ষণ না "স্কুয়েড" বিধিগুলির কোনও লঙ্ঘন না হয়। আপনি উইন্ডোগুলির জন্য অপেক্ষা করতে সীমাবদ্ধ নন যেখানে ব্যাঙগুলি পার্শ্বীয় গতি ছাড়াই উল্লম্বভাবে হপ করতে সক্ষম।
COTO

@ কোটো আমার "স্টেটস" এর গণনায় আমি একটি গুরুত্বপূর্ণ বিষয়টি ভুলে গেছি, যথা এখন পর্যন্ত ক্রসিংয়ের সংখ্যা, তাই আমি আরও স্পষ্ট ব্যাখ্যা দেওয়ার চেষ্টা করেছি। অনুমানটি বেশ ভাল লেখা ছিল। দেখে মনে হচ্ছে আমি এই বিশেষ ইস্যুগুলির প্রথমবার সঠিকভাবে ব্যাখ্যা করেছি।
শুক্রবার

আমি সর্বোত্তমটিকে 162 + 10% = 178 ক্রসিং হিসাবে গণনা করি তবে আপনার যথেষ্ট পরিমাণে কাছে। আমি সত্যিই এটিকে নিখরচায় শক্তিশালী করতে সক্ষম হতে চাইনি, তবে স্পষ্টতই আমার সমস্যাটি আরও চিন্তা করা উচিত ছিল। ন্যায়সঙ্গতভাবে, আমি আপনাকে 100 জন পুরষ্কার দেব।
কোতো

স্পষ্টতই "অনুগ্রহ" দেওয়ার আগে আমাকে 24 ঘন্টা অপেক্ষা করতে হবে। কী কারণে: কে জানে। এসই অবশ্যই উত্তরগুলিকে নিয়মিত পুরস্কৃত করতে চাইবে না। আমরা যদি তা করি তবে সন্ত্রাসীরা জিতবে। : ও
COTO
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.