ডোমিনো টিলিংয়ের সংখ্যা


9

এমন একটি প্রোগ্রাম বা ফাংশন লিখুন যা ইতিবাচক এন এবং মি দিয়েছে আপনি মি দ্বারা আয়তক্ষেত্রের দ্বারা n এ ফিট করতে পারেন এমন বৈধ স্বতন্ত্র ডোমিনো টিলিংয়ের সংখ্যা গণনা করে । এই ক্রম A099390 মধ্যে পূর্ণসংখ্যা ক্রম অনলাইন বিশ্বকোষ । আপনি কোনও যুক্তিসঙ্গত বিন্যাসে ফাংশন আর্গুমেন্ট (গুলি), সিএলএ বা স্টিডিন হিসাবে ইনপুট নিতে পারেন। আপনাকে আউটপুট হিসাবে একটি একক পূর্ণসংখ্যার ফিরে আসতে হবে বা মুদ্রণ করতে হবে।

প্রতিটি টাইলিংয়ের কোনও ফাঁক ফেলে রাখা উচিত নয় এবং প্রতিটি পৃথক টাইলিং গণনা করা হয়, যার মধ্যে আবর্তন, প্রতিচ্ছবি ইত্যাদি রয়েছে উদাহরণস্বরূপ, 2x3 এর টিলিংগুলি হ'ল:

|--    |||    --| 
|--    |||    --|

ইনপুট / আউটপুট উদাহরণ:

1,  9 -> 0
2,  2 -> 2
2,  3 -> 3
4,  4 -> 36
4,  6 -> 281
6,  6 -> 6728
7, 10 -> 53175517

আপনার প্রোগ্রামটি তাত্ত্বিকভাবে কোনও এন এবং এম এর জন্য কাজ করা উচিত , তবে যদি আপনার প্রোগ্রামটির অত্যধিক মেমরির প্রয়োজন হয় বা আপনার ডেটা টাইপ ওভারফ্লোস এটি বাহ্য হয়। আপনার প্রোগ্রামটি অবশ্যই কোনও এন, এম <= 8 এর জন্য সঠিকভাবে কাজ করবে ।


বাইটস মধ্যে সংক্ষিপ্ত কোড।


আপনি যদি কেবল 2n এক্স 2 মিটার জায়গাগুলির অনুমতি দিতেন তবে আপনি আমাদের জীবনকে আরও সহজ করে তুলতে পারতেন , দুর্দান্ত চ্যালেঞ্জ!
flawr


@ edc65 দামনিট = / আমি কোনও উপন্যাসের কথা ভাবতে পারি না ... আমার মনে হয় প্রায় প্রতিটি চ্যালেঞ্জ ইতিমধ্যে কিছু আকারে সম্পন্ন হয়েছে। যেভাবেই হোক, আমার প্রশ্নগুলি একটি কোড গল্ফ হওয়ায় চ্যালেঞ্জগুলি হুবহু এক নয়, এবং আপনাকে টিলিংসগুলি খুঁজে বের করতে হবে না - কেবলমাত্র তার পরিমাণ। সম্ভবত লোকেরা ব্রুটোফেসার লেখার পরিবর্তে সুন্দর সূত্রগুলি ব্যবহার করতে পারে।
orlp

সম্মত - অন্য মন্তব্য মুছে ফেলতে
চলেছেন

বিল্বুর মন্তব্য অনুলিপি করা হয়েছে (যা তিনি 1 জন প্রতিনিধি হওয়ার কারণে উত্তর হিসাবে পোস্ট করেছেন): "এই সমস্যাটি একটি স্পোজেজ চ্যালেঞ্জকে সংক্ষিপ্ত করা হয়েছে: spoj.com/problems/MNTILE এসপিওজে সংক্ষিপ্ততম কোডটি 98 বাইট বিশিষ্ট" " । দেখে মনে হচ্ছে আমি দ্বিগুণ অনিয়ন্ত্রিত - আমি অজানা ছিলাম।
অরল্প

উত্তর:


3

পাইথ, 30 29 বাইট

L?bsmy-tb]dfq1.a-VThbb1y*FUMQ

এটি অনলাইনে ব্যবহার করে দেখুন: বিক্ষোভ / পরীক্ষার স্যুট

সমস্ত উদাহরণ ইনপুট অনলাইন সংকলক চালিত। শেষটি যদিও কয়েক সেকেন্ড সময় নেয়।

ব্যাখ্যা:

আমার কোডে আমি একটি পুনরাবৃত্তি ফাংশন সংজ্ঞায়িত করব y। ফাংশনটি y2D- স্থানাঙ্কের একটি তালিকা নেয় এবং এই স্থানাঙ্কগুলি ব্যবহার করে বিভিন্ন ডোমিনো টিলিংয়ের সংখ্যা প্রদান করে। যেমন y([[0,0], [0,1]]) = 1(একটি অনুভূমিক ডোমিনো), y([[0,0], [1,1]]) = 0(স্থানাঙ্কগুলি সংলগ্ন নয়) এবং y([[0,0], [0,1], [1,0], [1,1]]) = 2(দুটি অনুভূমিক বা দুটি উল্লম্ব ডোমিনয়েস)। ফাংশনটি সংজ্ঞায়নের পরে আমি এটিকে সমস্ত স্থানাঙ্কের [x,y]সাথে কল করব x in [0, 1, m-1], y in [0, 1, n-1]

পুনরাবৃত্তির কাজটি কীভাবে কাজ করে? এটা বেশ সহজ। যদি কর্ডগুলির তালিকা খালি থাকে তবে ঠিক একটি বৈধ টাইলিং এবং yরিটার্ন রয়েছে 1

অন্যথায় আমি তালিকার প্রথম স্থানাঙ্ক গ্রহণ করি b[0]এবং প্রতিবেশীদের জন্য অবশিষ্ট স্থানাঙ্ক অনুসন্ধান করি। যদি কোন প্রতিবেশী b[0]তাহলে, কোন সম্ভাব্য টালি হয়, তাই আমি ফিরে 0. যদি এক বা একাধিক প্রতিবেশীদের হয়, তাহলে tilings সংখ্যা (tilings যেখানে আমি সংযোগ সংখ্যা b[0]একটি domina মাধ্যমে প্রথম প্রতিবেশীর সাথে, প্লাস আমি b[0]দ্বিতীয় প্রতিবেশীর সাথে যেখানে সংযোগ করেছি তার সংখ্যার , আরও ...) তাই আমি সংক্ষিপ্ত তালিকার সাথে প্রতিটি প্রতিবেশীর জন্য ফাংশনটি পুনরাবৃত্তভাবে কল করি (দুটি কর্ড b[0]এবং প্রতিবেশী সরিয়ে)। এরপরে আমি সমস্ত ফলাফল সংযুক্ত করে সেগুলি ফিরিয়ে দেব।

স্থাবর ক্রমের কারণে সর্বদা কেবল দুটি প্রতিবেশী সম্ভব, একটি ডানদিকে এবং নীচে একটি। তবে আমার অ্যালগরিদম এটি সম্পর্কে চিন্তা করে না।

                          UMQ  convert the input numbers into ranges
                        *F     Cartesian product (coords of each square)
L                              define a function y(b):
 ?b                              if len(b) > 0:
           f         b             filter b for squares T, which satisfy:
              .a-VThb                Euclidean distance between T and b[0]
            q1                       is equal to 1 (direct neighbors)
    m                              map each neighbor d to:
      -tb]d                          remove d from b[1]
     y                               and call recursively y with the rest
   s                               sum all those values and return them
                                 else:
                      1            return 1 (valid domino tiling found)
                       y*FUMQ  Call y with all coords and print the result  

আপনার প্রোগ্রামটি কীভাবে কাজ করে সে সম্পর্কে আপনি আমাদের কিছুটা আরও বলতে পারেন? আমি মন্তব্যগুলি থেকে আপনার অ্যালগরিদম বের করতে পারি না।
flawr

@ ফ্লোয়ার আমি আমার অ্যালগরিদমের একটি ব্যাখ্যা যুক্ত করেছি।
জাকুবে

@ জ্যাকটিউব ব্যাখ্যাটির জন্য ধন্যবাদ, আমি সত্যিই পুনরাবৃত্ত পদ্ধতির পছন্দ করি!
flawr

3

মতলব, 292

আমি নিশ্চিত যে এটি কেবল অন্য ভাষায় পোর্ট করে এটি অনেক ছোট করা যেতে পারে।

প্রাথমিক ধারণাটি হ'ল ফলদায়ক: আমি বোর্ডে m*n/2ডোমিনো ইট কীভাবে রাখব তার সমস্ত উপায়ে একটি গণনা নিয়ে এসেছি m*n। তবে এই গণনাটিতে অনেকগুলি অবৈধ টিলিংস (ইটের যা ওভারল্যাপ করে বা বোর্ডের বাইরে চলে যায়। তা অন্তর্ভুক্ত) তাই প্রোগ্রামটি সমস্ত টিলিংগুলি তৈরি করে এবং কেবলমাত্র বৈধগুলি গণনা করে। রানটাইম জটিলতা প্রায় O(2^(m*n/2) * m*n)। স্মৃতিশক্তি কোনও সমস্যা নয় 8x8কারণ এটি কেবল O(m*n)মেমরির প্রয়োজন । তবে এর জন্য প্রয়োজনীয় সময়টি 8x8প্রায় 20 দিন।

এখানে সম্পূর্ণরূপে মন্তব্য করা সংস্করণ যা যা চলছে তা ব্যাখ্যা করে।

পিএস: যদি কেউ মাতলাব সিনট্যাক্স হাইলাইটিংয়ের কাজটি তৈরি করতে জানেন তবে দয়া করে এই উত্তরে সংশ্লিষ্ট ট্যাগটি অন্তর্ভুক্ত করুন!

function C=f(m,n)
d = ceil(m*n/2);%number of dominoes
%enumeration: %the nth bit in the enumeration says whether the nth 
% domino pice is upright or not. we enumerate like this:
% firt piece goes top left:
% next piece goes to the left most column that has an empty spot, in the
% top most empty spot of that column
C=0;%counter of all valid tilings
for e=0:2^d-1 %go throu all enumerations
    %check whether each enumeration is valid
    A = ones(m,n);
    %empty spots are filled with 1
    %filled spots are 0 (or if overlapping <0) 
    v=1;%flag for the validity. hte grid is assumed to be valid until proven otherwise
    for i=1:d %go throu all pieces, place them in A
        %find the column where to place:
        c=find(sum(A)>0,1);
        %find the row where to place:
        r=find(A(:,c)>0,1);
        %find direction of piece:
        b=de2bi(e,d);
        if b(i)
            x=0;y=1;
        else
            x=1;y=0;
        end
        %fill in the piece:
        try
            A(r:r+y,c:c+x)=A(r:r+y,c:c+x)-1;
        catch z
            v=0;break;
        end
        %check whether A has no overlapping pieces
        if any(A(:)<0)
            v=0;break;
        end
    end
    %if valid, count it as valid
    if v && ~norm(A(:))
        disp(A)
        C=C+1;
    end
end

এখানে সম্পূর্ণ গল্ফড এক:

function C=f(m,n);m=4;n=6;d=ceil(m*n/2);C=0;for e=0:2^d-1;A=ones(m,n);v=1;for i=1:d;c=find(sum(A)>0,1);r=find(A(:,c)>0,1);b=de2bi(e,d);if b(i);x=0;y=1;else;x=1;y=0;end;try;A(r:r+y,c:c+x)=A(r:r+y,c:c+x)-1;catch z;v=0;break;end;if any(A(:)<0);v=0;break;end;end;if v && ~norm(A(:));C=C+1;end;end

2

সি 89, 230 বাইট

f(n,m,b)int*b;{int s,i;s=i=0;
while(b[i])if(++i==n*m)return 1;
if(i/n<m-1){b[i]=b[i+n]=1;s+=f(n,m,b);b[i]=b[i+n]=0;}
if(i%n<n-1&&!(b[i]|b[i+1])){b[i]=b[i+1]=1;s+=f(n,m,b);b[i]=b[i+1]=0;}
return s;}
g(n,m){int b[99]={};return f(n,m,b);}

পঠনযোগ্যতার জন্য আমি এই উত্তরটি হস্তান্তর করেছি - 230 বাইট পেতে সমস্ত নতুনলাইন নিরাপদে মুছে ফেলা যায়।

এমন একটি ফাংশন সংজ্ঞায়িত করে int g(int n, int m)যা টিলিংয়ের সংখ্যা প্রদান করে। এটি একটি সহায়ক ফাংশন ব্যবহার fকরে যা একটি ডোমিনো রেখে, পুনরাবৃত্তি করে এবং তারপরে একটি শেয়ার্ড বোর্ডে ডোমিনো সরিয়ে সমস্ত বৈধ টিলিংগুলিতে পুনরাবৃত্তি করে।


0

পাইথন 243

আমি একটি নিষ্ঠুর শক্তি পদ্ধতির পক্ষে বেছে নিয়েছি:

  • এম * এন / 2 দিকনির্দেশ উত্পন্ন করুন;
  • এম * এন বোর্ডে ডোমিনো চেষ্টা করে ফিট করুন।

যদি সেগুলি সমস্ত ফিট হয় এবং কোনও ফাঁকা জায়গা না থাকে তবে আমাদের বৈধ প্রবেশ রয়েছে।

কোডটি এখানে:

import itertools as t
m,n=input()
c,u=0,m*n
for a in t.product([0,1],repeat=u/2):
 l,k,r,h=[' ',]*u,0,'-|',[1,m]
 for t in a:
  l[k]=r[t]
  k+=h[t]   
  if k%m<m and k/m<n and l[k]==' ':l[k]=r[t]
  k=''.join(l).find(' ',1)
 if k<0:c+=1
print c
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.