23x20 এ 230,794.38, 100k রান
সর্বশেষ আপডেট: অবশেষে আমি নিখুঁত গতিশীল 2-পাথ সমাধান তৈরি করেছি। আমি বললাম নিখুঁত যেহেতু পূর্ববর্তী সংস্করণটি আসলে প্রতিসম নয়, মাতাল যদি অন্য পথ ধরে একটি পথ নেয় তবে আরও দীর্ঘ পথ পাওয়াই সহজ ছিল। বর্তমানেরটি একটি প্রতিসম, তাই এটি উচ্চতর প্রত্যাশিত পদক্ষেপ পেতে পারে। কয়েকটি পরীক্ষার পরে, এটি প্রায় 230k এর কাছাকাছি বলে মনে হচ্ছে, এটি আগেরটির তুলনায় একটি উন্নতি যা প্রায় 228k। তবে পরিসংখ্যানগতভাবে বলতে গেলে এই সংখ্যাগুলি এখনও তাদের বিশাল বিচ্যুতির মধ্যে রয়েছে, তাই আমি দাবি করি না যে এটি উল্লেখযোগ্যভাবে ভাল, তবে আমি বিশ্বাস করি এটি আগের সংস্করণের চেয়ে ভাল হওয়া উচিত।
কোডটি এই পোস্টের নীচে রয়েছে। এটি আপডেট করা হয়েছে যাতে এটি পূর্ববর্তী সংস্করণের তুলনায় অনেক দ্রুত, 23 এর মধ্যে 1000 রান পূর্ণ করে।
নীচে নমুনা চালানো এবং নমুনা গোলকধাঁধা:
পারফেক্ট ওয়াকার
গড়: 230794.384
সর্বাধিক: 1514506
ন্যুনতম: 25860
2317.374 এ সম্পন্ন হয়েছে
_ _ _ _ _ _ _ _ _ _ _ _ _ _
| | | | | | | | | | | | | | | _ _ _ _ _
| | | | | | | | | | | | | | | | _ _ _ _ _
| | | | | | | | | | | | | | | _ _ _ _ | |
| | | | | | | | | | | | | | | | _ _ _ _ _
| | | | | | | | | | | | | | | _ _ _ _ | |
| | | | | | | | | | | | | | | | _ _ _ _ _
| | | | | | | | | | | | | | | _ _ _ _ | |
| | | | | | | | | | | | | |: _ | | _ _ _ _ _
| | | | | | | | | | | | | _ _ _ _ _ _ _ |
| | | | | | | | | | | | | | _ _ _ _ _ _ _
| | | | | | | | | | | | | _ _ _ _ _ _ _ |
| | | | | | | | | | | | | | _ _ _ _ _ _ _
| | | | | | | | | | | | | _ _ _ _ _ _ _ |
| | | | | |: _ | |: _ | |: _ | |: _ | | _ _ _ _ _ _ _
| | | | | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
| | | | | | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
| | | | | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
| |: _ | |: _ | | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
পূর্ববর্তী জমাগুলি
পরিশেষে আমি স্পার এর ফলাফল মেলে করতে পারি! = D:
আমার আগের পরীক্ষাগুলির উপর ভিত্তি করে (এই পোস্টের নীচের অংশটি দেখুন) সর্বোত্তম কৌশলটি হ'ল মাতালটি যে কোনওটির কাছে পৌঁছানোর সাথে সাথে দ্বিগুণ পথ রয়েছে এবং একটিটিকে বন্ধ করে দেওয়া হবে এবং মাতালটি কোথায় যাবে সে সম্পর্কে আমরা পরিবর্তনশীলভাবে ভবিষ্যদ্বাণী করতে পারি যে পরিবর্তনটি এসেছে from তার দীর্ঘতর পথে যাওয়ার সম্ভাবনা বাড়িয়ে দিন।
সুতরাং আমার DOUBLE_PATH
কৌশলটির ভিত্তিতে , আমি আর একটি তৈরি করেছি, যা DOUBLE_PATH
মাতালদের গতিবিধির উপর নির্ভর করে গোলকধাঁধা পরিবর্তন করে (আমার ধাঁধাঁটি সহজেই পরিবর্তনযোগ্য হয়েছিল)। যেহেতু তিনি একাধিক উপলভ্য বিকল্প সহ একটি পথ অবলম্বন করেন, আমি কেবল দুটি সম্ভাব্য বিকল্প (যেটি থেকে সে এসেছিল, অন্যটি অবিকৃত নয়) ছেড়ে দিতে আমি পথগুলি বন্ধ করব।
এটি স্পার যা অর্জন করেছে তার সমান মনে হচ্ছে, ফলাফলটি দেখায়। এটিকে আরও ভাল হিসাবে বিবেচনা করার জন্য তার সাথে পার্থক্যটি খুব সামান্য, তবে আমি বলব যে আমার পদ্ধতির তার চেয়ে বেশি গতিশীল, যেহেতু আমার গোলকধাঁধাঁটি স্পার এর = এর চেয়ে বেশি পরিবর্তনযোগ্য)
একটি নমুনা চূড়ান্ত গোলকধাঁধা সহ ফলাফল:
EXTREME_DOUBLE_PATH
গড়: 228034.89
সর্বাধিক: 1050816
ন্যুনতম: 34170
396.728 এর মধ্যে সম্পন্ন হয়েছে
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
| | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
| | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
| | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
| | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
| | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
| | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
_ _ _ _ _ _ _ _ _ _ _ | | _ _ _ _ _ _ _ _ _ _
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
_ _ _ _ _ _ | | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
পরীক্ষা বিভাগ
সেরা কৌশলটি স্টোকাস্টিকের মতো একই কৌশল হিসাবে দেখা যায়, আমি বিভিন্ন কৌশল ব্যবহার করে এবং দুর্দান্ত ফলাফলগুলি মুদ্রণের জন্য গর্ব করি take
মাতাল ঘরে পৌঁছে যাওয়ার পরে নীচের প্রতিটি মুদ্রিত গোলকধাঁধাটি হ'ল শেষ গোলকধাঁধা , তাই তারা মাতাল হয়ে যাওয়া আন্দোলনের এলোমেলো এবং প্রতিকূলতার গতিবেগের কারণে রান থেকে চালানো থেকে কিছুটা আলাদা হতে পারে।
আমি প্রতিটি কৌশল বর্ণনা করব:
একক পথ
এটি সহজতম পদ্ধতির, যা প্রবেশ থেকে প্রস্থান করার জন্য একটি একক পথ তৈরি করবে।
SINGLE_PATH
গড়: 162621.612
সর্বাধিক: 956694
ন্যুনতম: 14838
149.430 এর মধ্যে সম্পন্ন হয়েছে
_ _ _ _ _ _ _ _ _ _ _ _
| |: _ | |: _ | |: _ | |: _ | |: _ | |: _ | |: _ | |: _ | |: _ | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
দ্বীপ (স্তর 0)
এটি এমন একটি পন্থা যা মাতালকে প্রায় বিচ্ছিন্ন একটি দ্বীপে আটকাতে চেষ্টা করে। আমি যেমনটি প্রত্যাশা করেছিলাম তেমন ভাল কাজ করে না তবে এটি আমার প্রথম ধারণাগুলির মধ্যে একটি, তাই আমি এটি অন্তর্ভুক্ত করছি।
প্রস্থান করার পথে দুটি পথ রয়েছে, এবং মাতাল যখন তাদের কোনওটির কাছে পৌঁছে, তখন শত্রুরা এটি বন্ধ করে দেয় এবং তাকে অন্য প্রস্থানটি খুঁজে বের করতে বাধ্য করে (এবং সম্ভবত দ্বীপে আবার আটকা পড়ে)
আইল্যান্ড
গড়: 74626.070
সর্বাধিক: 428560
ন্যুনতম: 1528
122.512 এর মধ্যে সম্পন্ন হয়েছে
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
| |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ | |
| |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ | |
| |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ | |
| |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ | |
| |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ | |
| |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ | |
| |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ | |
| |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ | |
| |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ | |
| |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ | |
| |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ | |
| |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ | |
| |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ | |
| |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ | |
| |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ | |
| |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ | |
|: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ |: _ | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
ডাবল পাথ
এটিই সর্বাধিক আলোচিত কৌশল, যা প্রস্থান করার জন্য দুটি সমান দৈর্ঘ্যের পাথ থাকতে হবে এবং মাতাল তাদের কোনওটির কাছে যাওয়ার সাথে সাথে তার একটিকে বন্ধ করে দেয়।
DOUBLE_PATH
গড়: 197743.472
সর্বাধিক: 1443406
ন্যুনতম: 21516
308.177 এ সম্পন্ন হয়েছে
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ | | _ _ _ _ _ _ _ _ _ _ _
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
_ _ _ _ _ _ _ _ _ _ | | _ _ _ _ _ _ _ _ _ _ _
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
_ _ _ _ _ _ _ _ _ _ | | _ _ _ _ _ _ _ _ _ _ _
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
_ _ _ _ _ _ _ _ _ _ | | _ _ _ _ _ _ _ _ _ _ _
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
_ _ _ _ _ _ _ _ _ _ | | _ _ _ _ _ _ _ _ _ _ _
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
_ _ _ _ _ _ _ _ _ _ | | _ _ _ _ _ _ _ _ _ _ _
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
_ _ _ _ _ _ _ _ _ _ | | _ _ _ _ _ _ _ _ _ _ _
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
_ _ _ _ _ _ _ _ _ _ | | _ _ _ _ _ _ _ _ _ _ _
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
_ _ _ _ _ _ _ _ _ _ | | _ _ _ _ _ _ _ _ _ _ _
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
দ্বীপ (স্তর 1)
একক পথের দ্বীপের একাধিক পাথ এবং উচ্চ পথের গণনা দ্বারা অনুপ্রাণিত হয়ে আমরা দ্বীপটিকে প্রস্থান করার সাথে সংযুক্ত করি এবং দ্বীপে একক পথের ধাঁধা তৈরি করি, প্রস্থান করার জন্য মোট তিনটি পথ তৈরি করে এবং পূর্ববর্তী কেসের মতোই, যেকোনটি বন্ধ করে দিন মাতাল কাছাকাছি হিসাবে প্রস্থান করুন।
এটি খাঁটি একক পাথের চেয়ে কিছুটা ভাল কাজ করে তবে তবুও দ্বিগুণ পথকে পরাভূত করে না।
আইল্যান্ড
গড়: 166265.132
সর্বাধিক: 1162966
ন্যুনতম: 19544
471.982 এর মধ্যে সম্পন্ন হয়েছে
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
| _ _ _ _ _ _ _ _ _ _ _ | _ _
| | |: _ | |: _ | |: _ | |: _ | |: _ | |: _ | |: _ | |: _ | |
| | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| _ | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
দ্বীপ (স্তর 2)
পূর্ববর্তী ধারণাটি প্রসারিত করার চেষ্টা করে, আমি মোট পাঁচটি পথ তৈরি করে নেস্টেড দ্বীপ তৈরি করেছি, তবে এটি তেমন কার্যকর হবে বলে মনে হয় না।
আইল্যান্ড
গড়: 164222.712
সর্বাধিক: 927608
ন্যুনতম: 22024
793.591 এ সমাপ্ত
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | _
| | _ _ _ _ _ _ _ _ _ | _ | |
| | | |: _ | |: _ | |: _ | |: _ | |: _ | |: _ | |: _ | | |
| | | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | | |
| | | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | | |
| | | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | | |
| | | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | | |
| | | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | | |
| | | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | | |
| | | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | | |
| _ | _ | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
দ্বীপ (স্তর 3)
ডাবল পাথটি আসলে একক পথের চেয়ে আরও ভাল কাজ করে লক্ষ্য করে, আসুন দ্বীপটিকে দ্বৈত পথে পরিণত করুন!
ফলাফলটি দ্বীপের উপরে উন্নতি (স্তর 1), তবে এটি এখনও খাঁটি দ্বিগুণ পথকে হারাতে পারে না।
তুলনার জন্য, দ্বীপের আকারের দ্বিগুণ পথের ফলাফলটি গড়ে 131,134.42 মুভ। সুতরাং এটি বেশ কয়েকটি উল্লেখযোগ্য সংখ্যক চাল (প্রায় 40 কিলোমিটার) যুক্ত করে, তবে ডাবল পাথের জন্য যথেষ্ট নয় not
আইল্যান্ড
গড়: 171730.090
সর্বাধিক: 769080
ন্যুনতম: 29760
587.646 এ শেষ হয়েছে
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | _ _
| | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
| _ _ _ _ _ _ _ _ _ | | _ _ _ _ _ _ _ _ _ | |
| | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ | | _ _ _ _ _ _ _ _ _ | |
| | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ | | _ _ _ _ _ _ _ _ _ | |
| | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ | | _ _ _ _ _ _ _ _ _ | |
| | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ | | _ _ _ _ _ _ _ _ _ | |
| | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ | | _ _ _ _ _ _ _ _ _ | |
| | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ | | _ _ _ _ _ _ _ _ _ | |
| | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| _ _ _ _ _ _ _ _ _ | | _ _ _ _ _ _ _ _ _ | |
| | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| _ | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
দ্বীপ (স্তর 4)
আবার, নেস্টেড দ্বীপ নিয়ে পরীক্ষা-নিরীক্ষা করা, এবং আবার এটি এত ভাল কাজ করে না।
আইল্যান্ড
গড়: 149723.068
সর্বাধিক: 622106
ন্যুনতম: 25752
830.889 এর মধ্যে সম্পন্ন হয়েছে
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
| | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
| | | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
| | _ _ _ _ _ _ _ _ | | _ _ _ _ _ _ _ _ | | |
| | | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | | |
| | _ _ _ _ _ _ _ _ | | _ _ _ _ _ _ _ _ | | |
| | | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | | |
| | _ _ _ _ _ _ _ _ | | _ _ _ _ _ _ _ _ | | |
| | | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | | |
| | _ _ _ _ _ _ _ _ | | _ _ _ _ _ _ _ _ | | |
| | | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | | |
| | _ _ _ _ _ _ _ _ | | _ _ _ _ _ _ _ _ | | |
| | | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | | |
| | _ _ _ _ _ _ _ _ | | _ _ _ _ _ _ _ _ | | |
| | | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | | |
| | _ _ _ _ _ _ _ _ | | _ _ _ _ _ _ _ _ | | |
| | _ | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | | |
| _ | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
উপসংহার
সর্বোপরি, এটি প্রমাণ করে যে মাতাল বর্তমান অবস্থান থেকে প্রস্থান পর্যন্ত একক দীর্ঘ পথ পাওয়াই সবচেয়ে ভাল কাজ করে, যা দ্বিগুণ পথের কৌশল দ্বারা অর্জন করা হয়, যেহেতু একটি প্রস্থান বন্ধ করার পরে, মাতালকে সর্বোচ্চতম দূরত্বে ভ্রমণ করতে হবে বাহির.
এটি আরও ইঙ্গিত দেয় যে মৌলিক কৌশলটি এখনও দ্বৈত পথ হওয়া উচিত, এবং আমরা কেবলমাত্র পরিবর্তন করতে পারি যে কতগুলি গতিশীল পথ তৈরি হয়, যা স্পার দ্বারা সম্পন্ন হয়েছে। সুতরাং আমি বিশ্বাস করি তার কৌশলটিই চলার পথ!
কোড
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.TreeSet;
public class Walker {
enum Strategy{
SINGLE_PATH,
ISLAND,
DOUBLE_PATH,
EXTREME_DOUBLE_PATH,
PERFECT_DOUBLE_PATH,
}
int width,height;
int x,y; //walker's position
int dX,dY; //destination
Point[][] points;
int stepCount = 0;
public static void main(String[]args){
int side = 20;
// runOnce(side, Strategy.EXTREME_DOUBLE_PATH, 0);
runOnce(side, Strategy.PERFECT_DOUBLE_PATH, 0);
// for(Strategy strategy: Strategy.values()){
// runOnce(side, strategy, 0);
// }
// runOnce(side, Strategy.ISLAND, 1);
// runOnce(side, Strategy.ISLAND, 2);
// Scanner scanner = new Scanner(System.in);
// System.out.println("Enter side, strategy (SINGLE_PATH, ISLAND, DOUBLE_PATH, EXTREME_DOUBLE_PATH), and level:");
// while(scanner.hasNext()){
// side = scanner.nextInt();
// Strategy strategy = Strategy.valueOf(scanner.next());
// int level = scanner.nextInt();
// scanner.nextLine();
// runOnce(side, strategy, level);
// System.out.println("Enter side, strategy (SINGLE_PATH, ISLAND, DOUBLE_PATH, EXTREME_DOUBLE_PATH), and level:");
// }
// scanner.close();
}
private static Walker runOnce(int side, Strategy strategy, int level) {
Walker walker = null;
long total = 0;
int max = 0;
int min = Integer.MAX_VALUE;
double count = 1000;
long start = System.currentTimeMillis();
for(int i=0; i<count; i++){
walker = new Walker(0,0,side,side,side-1,side-1, strategy, level, false);
total += walker.stepCount;
max = Math.max(walker.stepCount, max);
min = Math.min(walker.stepCount, min);
// System.out.println("Iteration "+i+": "+walker.stepCount);
}
System.out.printf("%s\nAverage: %.3f\nMax: %d\nMin:%d\n",strategy, total/count, max, min);
System.out.printf("Completed in %.3fs\n", (System.currentTimeMillis()-start)/1000.0);
walker.printPath();
return walker;
}
private void createIsland(int botLeftX, int botLeftY, int topRightX, int topRightY){
for(int i=botLeftY+1; i<topRightY; i++){
if(i>botLeftY+1) deletePath(points[botLeftX][i].right());
if(i<topRightY-1) deletePath(points[topRightX][i].left());
}
for(int i=botLeftX+1; i<topRightX; i++){
if(i>botLeftX+1) deletePath(points[i][botLeftY].up());
if(i<topRightX-1) deletePath(points[i][topRightY].down());
}
}
private void createSinglePath(int botLeftX, int botLeftY, int topRightX, int topRightY){
for(int i=botLeftY; i<topRightY; i++){
if(i==topRightY-1 && (topRightY+1-botLeftY)%2==0){
for(int j=botLeftX; j<topRightX; j++){
if(j==topRightX-1 && (j-botLeftX)%2==0){
deletePath(points[topRightX][topRightY].down());
} else {
deletePath(points[j][topRightY-1+((j-botLeftX)%2)].right());
}
}
} else {
for(int j=botLeftX+(i-botLeftY)%2; j<topRightX+((i-botLeftY)%2); j++){
deletePath(points[j][i].up());
}
}
}
}
private void createDoublePath(int botLeftX, int botLeftY, int topRightX, int topRightY){
for(int i=botLeftY; i<topRightY; i++){
if(i>botLeftY && (width%4!=1 || i<topRightY-1)) deletePath(points[width/2-1][i].right());
if(i==topRightY-1 && (topRightY+1-botLeftY)%2==1){
for(int j=botLeftX; j<topRightX; j++){
if((j-botLeftX)%2==0 || j<topRightX-1){
deletePath(points[j][topRightY-1+((j-botLeftX)%2)].right());
} else {
deletePath(points[topRightX-1][topRightY-1].right());
}
}
} else {
if((i-botLeftY)%2==0){
for(int j=botLeftX+1; j<topRightX; j++){
deletePath(points[j][i].up());
}
} else {
for(int j=botLeftX; j<topRightX+1; j++){
if(j!=width/2 && j!=width/2-1){
deletePath(points[j][i].up());
}
}
}
}
}
}
public Walker(int startingX,int startingY, int Width, int Height, int destinationX, int destinationY, Strategy strategy, int level, boolean animate){
width = Width;
height = Height;
dX = destinationX;
dY = destinationY;
x=startingX;
y=startingY;
points = new Point[width][height];
for(int y=0; y<height; y++){
for(int x=0; x<width; x++){
points[x][y] = new Point(x,y);
}
}
for(int y=0; y<height; y++){
for(int x=0; x<width; x++){
if(x<width-1) new Edge(points[x][y], points[x+1][y]);
if(y<height-1) new Edge(points[x][y], points[x][y+1]);
}
}
if(strategy == Strategy.SINGLE_PATH) createSinglePath(0,0,width-1,height-1);
if(strategy == Strategy.DOUBLE_PATH) createDoublePath(0,0,width-1,height-1);
List<EdgeList> edgeLists = new ArrayList<EdgeList>();
if(strategy == Strategy.ISLAND){
List<Edge> edges = new ArrayList<Edge>();
if(level==0){
createIsland(0,0,width-1,height-1);
deletePath(points[width-2][height-2].right());
deletePath(points[width-2][height-2].up());
} else {
for(int i=0; i<level; i++){
createIsland(i,i,width-1-i, height-1-i);
}
createDoublePath(level,level,width-1-level,height-1-level);
for(int i=height-1; i>=height-level; i--){
edges.add(points[i-2][i].right());
edges.add(points[i][i-2].up());
edgeLists.add(new EdgeList(points[i-1][i].right(), points[i][i-1].up()));
}
}
edges.add(points[width-1-level][height-1-level].down());
edges.add(points[width-1-level][height-1-level].left());
edgeLists.add(new EdgeList(edges.toArray(new Edge[0])));
}
int[] availableVerticals = new int[height];
if(strategy == Strategy.EXTREME_DOUBLE_PATH){
for(int i=1; i<width-1; i++){
deletePath(points[i][0].up());
}
availableVerticals[0] = 2;
for(int i=1; i<height; i++){
availableVerticals[i] = width;
}
}
boolean[][] available = new boolean[width][height];
if(strategy == Strategy.PERFECT_DOUBLE_PATH){
for(int x=0; x<width; x++){
for(int y=0; y<height; y++){
if(x%2==1 && y%2==1){
available[x][y] = true;
} else {
available[x][y] = false;
}
}
}
}
// printPath();
while(!walk()){
if(animate)try{Thread.sleep(500);}catch(InterruptedException e){}
if(strategy == Strategy.ISLAND){
if(x==y && (x==1 || (x>=2 && x<=level))){
if(!hasBeenWalked(points[x][x].down())){
deletePath(points[x][x].down());
} else if(!hasBeenWalked(points[x][x].left())){
deletePath(points[x][x].left());
}
}
}
if(strategy == Strategy.EXTREME_DOUBLE_PATH){
Point cur = points[x][y];
int untravelled = 0;
for(Edge edge: cur.edges) if(edge!=null && !edge.walked) untravelled++;
if(untravelled>1){
if(cur.up()!=null && availableVerticals[y]>2 && !cur.up().walked){
deletePath(cur.up());
availableVerticals[y]--;
}
if(cur.down()!=null && !cur.down().walked){
deletePath(cur.down());
availableVerticals[y-1]--;
}
if(cur.up()!=null && cur.left()!=null && !cur.left().walked){
deletePath(cur.left());
deletePath(points[x][y+1].left());
}
if(cur.up()!=null && cur.right()!=null && !cur.right().walked){
deletePath(cur.right());
if(y<height-1) deletePath(points[x][y+1].right());
}
}
}
if(strategy == Strategy.PERFECT_DOUBLE_PATH){
Point cur = points[x][y];
int untravelled = 0;
for(Edge edge: cur.edges) if(edge!=null && !edge.walked) untravelled++;
if(x%2!=1 || y%2!=1){
if(untravelled>1){
if(cur.down()==null && hasBeenWalked(cur.right())){
if(canBeDeleted(cur.up())) deletePath(cur.up());
}
if(cur.down()==null && hasBeenWalked(cur.left())){
if(x%2==0 && y%2==1 && canBeDeleted(cur.right())) deletePath(cur.right());
else if(cur.right()!=null && canBeDeleted(cur.up())) deletePath(cur.up());
}
if(cur.left()==null && hasBeenWalked(cur.up())){
if(canBeDeleted(cur.right())) deletePath(cur.right());
}
if(cur.left()==null && hasBeenWalked(cur.down())){
if(x%2==1 && y%2==0 && canBeDeleted(cur.up())) deletePath(cur.up());
else if (cur.up()!=null && canBeDeleted(cur.right())) deletePath(cur.right());
}
}
} else {
if(!hasBeenWalked(cur.left())){
if(x>1 && available[x-2][y]){
if(untravelled>1){
available[x-2][y] = false;
deletePath(cur.up());
}
} else if(cur.up()!=null){
if(canBeDeleted(cur.left())) deletePath(cur.left());
if(canBeDeleted(points[x][y+1].left())) deletePath(points[x][y+1].left());
}
}
if(!hasBeenWalked(cur.down())){
if(y>1 && available[x][y-2]){
if(untravelled>1){
available[x][y-2] = false;
deletePath(cur.right());
}
} else if(cur.right()!=null){
if(canBeDeleted(cur.down())) deletePath(cur.down());
if(canBeDeleted(points[x+1][y].down())) deletePath(points[x+1][y].down());
}
}
}
}
if(strategy == Strategy.DOUBLE_PATH || strategy == Strategy.EXTREME_DOUBLE_PATH
|| strategy == Strategy.PERFECT_DOUBLE_PATH){
if(x==width-2 && y==height-1 && points[width-1][height-1].down()!=null){
deletePath(points[width-1][height-1].left());
}
if(x==width-1 && y==height-2 && points[width-1][height-1].left()!=null){
deletePath(points[width-1][height-1].down());
}
} else if(strategy == Strategy.ISLAND){
for(EdgeList edgeList: edgeLists){
boolean deleted = false;
for(Edge edge: edgeList.edges){
if(edge.start.x == x && edge.start.y == y){
if(!hasBeenWalked(edge)){
deletePath(edge);
edgeList.edges.remove(edge);
if(edgeList.edges.size() == 1){
edgeLists.remove(edgeList);
}
deleted = true;
break;
}
}
}
if(deleted) break;
}
}
if(animate)printPath();
}
}
public boolean hasBeenWalked(Edge edge){
if(edge == null) return false;
return edge.walked;
}
public boolean canBeDeleted(Edge edge){
if(edge == null) return false;
return !edge.walked;
}
public List<Edge> getAdjacentUntravelledEdges(){
List<Edge> result = new ArrayList<Edge>();
for(Edge edge: points[x][y].edges){
if(edge!=null && !hasBeenWalked(edge)) result.add(edge);
}
return result;
}
public void printPath(){
StringBuilder builder = new StringBuilder();
for(int y=height-1; y>=0; y--){
for(int x=0; x<width; x++){
Point point = points[x][y];
if(this.x==x && this.y==y){
if(point.up()!=null) builder.append('?');
else builder.append('.');
} else {
if(point.up()!=null) builder.append('|');
else builder.append(' ');
}
if(point.right()!=null) builder.append('_');
else builder.append(' ');
}
builder.append('\n');
}
System.out.print(builder.toString());
}
public boolean walk(){
ArrayList<Edge> possibleMoves = new ArrayList<Edge>();
Point cur = points[x][y];
for(Edge edge: cur.edges){
if(edge!=null) possibleMoves.add(edge);
}
int random = (int)(Math.random()*possibleMoves.size());
Edge move = possibleMoves.get(random);
move.walked = true;
if(move.start == cur){
x = move.end.x;
y = move.end.y;
} else {
x = move.start.x;
y = move.start.y;
}
stepCount++;
if(x==dX && y == dY){
return true;
} else {
return false;
}
}
public boolean isSolvable(){
TreeSet<Point> reachable = new TreeSet<Point>();
Queue<Point> next = new LinkedList<Point>();
next.offer(points[x][y]);
reachable.add(points[x][y]);
while(next.size()>0){
Point cur = next.poll();
ArrayList<Point> neighbors = new ArrayList<Point>();
if(cur.up()!=null) neighbors.add(cur.up().end);
if(cur.right()!=null) neighbors.add(cur.right().end);
if(cur.down()!=null) neighbors.add(cur.down().start);
if(cur.left()!=null) neighbors.add(cur.left().start);
for(Point neighbor: neighbors){
if(!reachable.contains(neighbor)){
if(neighbor == points[dX][dY]) return true;
reachable.add(neighbor);
next.offer(neighbor);
}
}
}
return false;
}
public boolean deletePath(Edge toDelete){
if(toDelete == null) return true;
// if(toDelete.walked){
// System.err.println("Edge already travelled!");
// return false;
// }
int startIdx = toDelete.getStartIdx();
int endIdx = toDelete.getEndIdx();
toDelete.start.edges[startIdx] = null;
toDelete.end.edges[endIdx] = null;
// if(!isSolvable()){
// toDelete.start.edges[startIdx] = toDelete;
// toDelete.end.edges[endIdx] = toDelete;
// System.err.println("Invalid deletion!");
// return false;
// }
return true;
}
static class EdgeList{
List<Edge> edges;
public EdgeList(Edge... edges){
this.edges = new ArrayList<Edge>();
this.edges.addAll(Arrays.asList(edges));
}
}
static class Edge implements Comparable<Edge>{
Point start, end;
boolean walked;
public Edge(Point start, Point end){
walked = false;
this.start = start;
this.end = end;
this.start.edges[getStartIdx()] = this;
this.end.edges[getEndIdx()] = this;
if(start.compareTo(end)>0){
Point tmp = end;
end = start;
start = tmp;
}
}
public Edge(int x1, int y1, int x2, int y2){
this(new Point(x1,y1), new Point(x2,y2));
}
public boolean exists(){
return start.edges[getStartIdx()] != null || end.edges[getEndIdx()] != null;
}
public int getStartIdx(){
if(start.x == end.x){
if(start.y < end.y) return 0;
else return 2;
} else {
if(start.x < end.x) return 1;
else return 3;
}
}
public int getEndIdx(){
if(start.x == end.x){
if(start.y < end.y) return 2;
else return 0;
} else {
if(start.x < end.x) return 3;
else return 1;
}
}
public boolean isVertical(){
return start.x==end.x;
}
@Override
public int compareTo(Edge o) {
int result = start.compareTo(o.start);
if(result!=0) return result;
return end.compareTo(o.end);
}
}
static class Point implements Comparable<Point>{
int x,y;
Edge[] edges;
public Point(int x, int y){
this.x = x;
this.y = y;
edges = new Edge[4];
}
public Edge up(){ return edges[0]; }
public Edge right(){ return edges[1]; }
public Edge down(){ return edges[2]; }
public Edge left(){ return edges[3]; }
public int compareTo(Point o){
int result = Integer.compare(x, o.x);
if(result!=0) return result;
result = Integer.compare(y, o.y);
if(result!=0) return result;
return 0;
}
}
}