চীনা চেকাররা দীর্ঘতম পদক্ষেপে


12

ইন চীনা চেকারস , এক টুকরা অন্য কোন টুকরা উপর প্লব দ্বারা বা এই ধরনের হপস একটি ক্রম তৈরি করে স্থানান্তর করতে পারেন। আপনার কাজ হপগুলির দীর্ঘতম সম্ভাব্য ক্রম সন্ধান করা।

ইনপুট

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

1011110011000001000000000000000000000000100000000001000000000000000000000000000001000000000000000000000001000001100111111

ব্যাখ্যা:

শীর্ষস্থানীয় স্থানটি একটি সবুজ টুকরা দ্বারা দখল করা হয়, সুতরাং ইনপুটটিতে প্রথম সংখ্যাটি হয় 1। দ্বিতীয় সারিতে একটি খালি অবস্থান এবং তারপরে একটি অধিষ্ঠিত অবস্থান রয়েছে, তাই 01পরবর্তী আসে। তৃতীয় সারিতে সমস্ত দখল করা, তাই 111। চতুর্থ সারিতে দুটি খালি এবং দুটি দখলকৃত স্থান (বাম থেকে ডান দিকে যেতে) রয়েছে, তাই 0011। তারপরে পরবর্তী সারির জন্য পাঁচটি 0, ক 1এবং সাতটি আসবে 0এবং আরও অনেক কিছু।

সেই সেটআপটির মতোই এখানেও একটি কোণ রয়েছে যা সরাসরি upর্ধ্বমুখী। বোর্ডে কয়েকটি সংখ্যক টুকরো থাকতে পারে (1 থেকে 121 পর্যন্ত)। নোট করুন যে বিভিন্ন রঙের টুকরা আলাদাভাবে উপস্থাপন করা হয় না।

আউটপুট

বোর্ডে কোনও টুকরো ব্যবহার করে আইনী হপের সর্বাধিক দৈর্ঘ্য। আপনি একই জায়গায় একাধিকবার দেখতে পারবেন না (শুরু এবং শেষের অবস্থানগুলি সহ)। তবে আপনি একই টুকরোটি একাধিকবার আশা করতে পারেন। যদি কোনও আইনি হপ না হয় তবে আউটপুট 0। আইনী নন-হপ পদক্ষেপ আছে কিনা তা বিবেচনা করবেন না।

উদাহরণস্বরূপ, উপরে বর্ণিত সেটআপের আউটপুট 3

ইনপুট এবং আউটপুট স্টিডিন এবং স্ট্ডআউটের মাধ্যমে, কমান্ড-লাইন আর্গুমেন্টের মাধ্যমে, ফাংশন কলগুলির মাধ্যমে বা অন্য কোনও অনুরূপ পদ্ধতির মাধ্যমে করা যেতে পারে।

পরীক্ষার কেস

ইনপুট:

0100000010000000000000000100000000000000000000000000000001010010000000000000000000000101000000000000000000100000000100001

আউটপুট: 0(কোনও দুটি টুকরো একে অপরের পাশে নেই)


ইনপুট:

0000000000111100000000011100000000011000000000100000000000000000000000000000000000000000000000000000000000000000000000000

আউটপুট: 1(শীর্ষ-বাম কোণে একটি প্লেয়ারের জন্য প্রাথমিক সেটআপ)


আমি আমার খালার সাথে এই খেলি; আমরা উভয়ই যুক্তিযুক্ত ভাল। এটি একটি আকর্ষণীয় চ্যালেঞ্জ।
সিজেফুরে

1
ইনপুট কীভাবে সঞ্চিত আছে / কোন বিটগুলি কোথায় যায় সে সম্পর্কে আপনার আরও উল্লেখ করা উচিত।
TheDoctor

আপনি কোন টুকরা "হপ ওভার" করতে পারেন? আমার মা এবং আমি যেভাবে খেলতাম, আপনি যে কোনও পথে কোনও টুকরো না পাওয়া পর্যন্ত distance দিকের যেকোন দূরত্বে যে কোনও এক টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টানতে পারেন সেই হাপের পথ অন্যরা খেলেন যে আপনি কেবল সংলগ্ন টুকরো টুকরো টুকরো টুকরো টানতে পারেন
জো জেড।

1
@ ডক্টর আমি আরও বিস্তারিত ব্যাখ্যা যুক্ত করেছি।
Ypnypn

আপনি কি বিশদটি পরিষ্কার করতে পারেন: আমাকে কি একই পদে দু'বার দখল করার অনুমতি দেওয়া হচ্ছে? আমি ধরে নিয়েছি যে আমি অসীমভাবে লুপ করতে পারছি না, তবে আমি যদি বাম-ডানদিকে চলমান কোনও স্থানে আঘাত করতে পারি এবং তারপরে আবার এটির উপরে-বাম থেকে নীচে-ডান দিকে সরে যেতে পারি তবে এটি সম্ভাবনা খুলে দেয়।
ডিভন পারসনস

উত্তর:


1

পার্ল, 345 322

সম্পাদনা করুন: গল্ফড, কিছুটা

আরও পরীক্ষার কেসগুলি দুর্দান্ত লাগবে তবে আপাতত দেখে মনে হচ্ছে এটি কাজ করে। প্রয়োজনে আমি পরে মন্তব্য যুক্ত করব। পাঠযোগ্যতার জন্য নতুন লাইন এবং ইন্ডেন্টেশন সহ:

$_=<>;
$s=2x185;
substr$s,(4,22,unpack'C5(A3)*','(:H[n129148166184202220243262281300')[$i++],0,$_ 
    for unpack A.join A,1..4,13,12,11,10,9..13,4,3,2,1;
$_=$s;
sub f{
    my(@a,%h)=@_;
    $h{$_}++&&return for@a;
    $-+=$#a>$-;
    $s=~/^.{$a[0]}$_/&&f($+[1],@a)
        for map{("(?=.{$_}1.{$_}(0))","(?<=(0).{$_}1.{$_}.)")}0,17,18
}
f$+[0]while/1/g;
print$-

আমি কয়েকটি পরীক্ষার মামলা যুক্ত করেছি।
Ypnypn

যারা কাজ ঠিক আছে, কিন্তু তারা খুব সহজ :-)।
ব্যবহারকারী 2846289

2

সি, 262 260

গল্ফযুক্ত কোড (ডিবাগিং কোড এবং অপ্রয়োজনীয় শ্বেত স্থান অপসারণ করা হয়েছে। স্ট্যান্ডিনের মাধ্যমে ইনপুট থেকে কমান্ড লাইনের মাধ্যমে ইনপুট পরিবর্তন করা হয়েছিল এবং আমি সেখানে ভেরিয়েবল ঘোষণার সুযোগের সদ্ব্যবহার করেছি Latest সর্বশেষ সম্পাদনা: কোড forদুটি সেমিকোলন সংরক্ষণের জন্য লুপের বন্ধনীগুলিতে সরিয়ে নিয়েছে ))

t[420],j,l,x,y;f(p,d){int z,q,k;for(k=6;k--;t[q]&!t[p+z]?t[q]=0,f(q,d+1),t[q]=1:0)z="AST?-,"[k]-64,q=p+z*2;l=d>l?d:l;}main(int i,char**s){for(i=840;i--;x>3&y>5&x+y<23|x<13&y<15&x+y>13?i>420?t[i-420]=49-s[1][j++]:t[i]||f(i,0):0)x=i%20,y=i/20%21;printf("%d",l);}

ব্যাখ্যা

এটি একটি 20x21 বোর্ডের উপর নির্ভর করে যা দেখতে এর মতো দেখায়, প্রোগ্রাম শুরু হওয়ার পরে শূন্যে ভরা থাকে (এই ASCII শিল্পটি প্রোগ্রামের একটি পরিবর্তিত সংস্করণ দ্বারা উত্পাদিত হয়েছিল এবং iলুপটি নীচের দিকে গণনা করা হওয়ায় শূন্যটি নীচের ডানদিকে রয়েছে):

....................
....................
...............#....
..............##....
.............###....
............####....
.......#############
.......############.
.......###########..
.......##########...
.......#########....
......##########....
.....###########....
....############....
...#############....
.......####.........
.......###..........
.......##...........
.......#............
....................
....................

লুপ iএই বোর্ডের মধ্য দিয়ে দু'বার চলে এবং x এবং y ব্যবহার করে বর্গটি আসলে চেকবোর্ডের অন্তর্ভুক্ত কিনা তা গণনা করতে (এর জন্য x এবং y এ 6 পৃথক বৈষম্য প্রয়োজন))

যদি এটি হয় তবে প্রথমবারের মতো এটি স্কোয়ারগুলি পূর্ণ করে, একটি 0(দখলকৃত) জন্য 1একটি 1(মিথ্যা) এবং একটি (অনাবৃত) জন্য একটি সত্য 0(সত্য) রাখে। এই বিপরীকরণটি গুরুত্বপূর্ণ, কারণ সমস্ত সীমানার স্কোয়ারগুলিতে ইতিমধ্যে 0 রয়েছে, যার অর্থ তারা দখলকৃত স্কোয়ারের সাথে সাদৃশ্যযুক্ত এবং এটি স্পষ্ট যে কোনও নির্দিষ্ট চেকের প্রয়োজন ছাড়াই এগুলিতে লাফানো যাবে না।

দ্বিতীয় বার রাউন্ডে, বর্গক্ষেত্রটি দখল করা হলে (0 টি থাকে) এটি সেই ফাংশনটিকে কল করে fযা চালগুলি অনুসন্ধান করে।

fএক্সপ্রেশনটিতে এনকোড করা +/- 1 (অনুভূমিক), +/- 20 (উল্লম্ব) এবং +/- 19 (তির্যক) দ্বারা এনকোড হওয়া 6 টি সম্ভাব্য দিকগুলিতে পুনরাবৃত্তভাবে অনুসন্ধান করে "AST?-,"[k]-64। এটি যখন হিট পায়, তখন নিজেকে পুনরাবৃত্তভাবে কল করার আগে এটি সেলটি 0 (দখলকৃত) এ সেট করে, তারপরে ফাংশনটি ফিরে আসার পরে এটিকে 1 (খালি) এ ফিরে সেট করে। সেই ঘরের মধ্যে একবারে হোপিং রোধ করতে পুনরাবৃত্ত কলের আগে ঘরের মান অবশ্যই পরিবর্তন করতে হবে।

অবহেলিত কোড

char s[999];                           //input string.
t[420],i,j,l,x,y;                      //t=board. i=board counter, j=input counter. l=length of longest hop found so far.

f(p,d){                                //p=position, d= recursion depth.
  //printf("%d,%d ",p,d);              //debug code: uncomment to show the nodes visited.
  int k,z,q;                           //k=counter,z=displacement,q=destination
  for(k=6;k--;)                        //for each direction
    z="AST?-,"[k]-64,                  //z=direction
    q=p+z*2,                           //q=destination cell
    t[q]&!t[p+z]?                      //if destination cell is empty (and not out of bounds) and intervening cell is full
      t[q]=0,f(q,d+1),t[q]=1           //mark destination cell as full, recurse, then mark it as empty again.
      :0;
  l=d>l?d:l;                           //if d exceeds the max recorded recursion depth, update l
}

main(){
  gets(s);                             //get input
  for(i=840;i--;)                      //cycle twice through t
    x=i%20,                            //get x
    y=i/20%21,                         //and y coordinates
    x>3&y>5&x+y<23|x<13&y<15&x+y>13?   //if they are in the bounds of the board
      i>420?
        t[i-420]=49-s[j++]             //first time through the array put 0 for a 1 and a 1 for a 0 ('1'=ASCII49)
        :t[i]||f(i,0)                  //second time, if t[i]=0,call f(). 
       //,puts("")                     //puts() formats debug output to 1 line per in-bounds cell of the board
      :0;
  printf("%d",l);                      //print output
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.