জাভাস্ক্রিপ্ট (ES6), 154 134 বাইট
m=>m.map((r,Y)=>r.map(g=(_,x,y,r=m[y=1/y?y:Y])=>r&&r[x]&&[-1,0,1,2].map(d=>r[r[x]=0,/1/.test(m)?g(_,x+d%2,y+~-d%2):++n,x]=1)),n=0)|n/4
এটি অনলাইন চেষ্টা করুন!
কিভাবে?
পদ্ধতি
প্রতিটি সম্ভাব্য কক্ষ থেকে শুরু করে, আমরা ম্যাট্রিক্সকে বন্যায় পূর্ণ করি, আমাদের পথে সমস্ত কক্ষ সাফ করি। যখনই ম্যাট্রিক্সে আরও 1 টি থাকে না , আমরা সম্ভাব্য পাথের সংখ্যা n বৃদ্ধি করি ।
প্রতিটি বৈধ পাথ 4 বার গণনা করা হয় কারণ শেষ কক্ষে যে দিকটি বেছে নেওয়া হয়েছে, তাতে আসলে কিছু আসে যায় না। অতএব, চূড়ান্ত ফলাফল এন / 4 ।
পুনরাবৃত্তি ফাংশন
দ্বিতীয় মানচিত্রের কলব্যাক () এর থেকে পুনরাবৃত্ত ফাংশন জি () কল করার পরিবর্তে এইভাবে ...
m=>m.map((r,y)=>r.map((_,x)=>(g=(x,y,r=m[y])=>...g(x+dx,y+dy)...)(x,y)))
... আমরা recursive ফাংশন নির্ধারণ ) জি ( সরাসরি কলব্যাক যেমন এর মানচিত্র () :
m=>m.map((r,Y)=>r.map(g=(_,x,y,r=m[y=1/y?y:Y])=>...g(_,x+dx,y+dy)...))
Yy=1/y?y:Y
এর প্রাথমিক মান নির্ধারণের জন্য প্রয়োজনীয় দীর্ঘ সূত্র সত্ত্বেও এটি সামগ্রিকভাবে 2 বাইট সংরক্ষণ করে।
মন্তব্য করা কোড
m => // given the input matrix m[][]
m.map((r, Y) => // for each row r[] at position Y in m[][]:
r.map(g = ( // for each entry in r[], use g() taking:
_, // - the value of the cell (ignored)
x, // - the x coord. of this cell
y, // - either the y coord. or an array (1st iteration),
// in which case we'll set y to Y instead
r = m[y = 1 / y ? y : Y] // - r = the row we're currently located in
) => // (and update y if necessary)
r && r[x] && // do nothing if this cell doesn't exist or is 0
[-1, 0, 1, 2].map(d => // otherwise, for each direction d,
r[ // with -1 = West, 0 = North, 1 = East, 2 = South:
r[x] = 0, // clear the current cell
/1/.test(m) ? // if the matrix still contains at least one '1':
g( // do a recursive call to g() with:
_, // a dummy first parameter (ignored)
x + d % 2, // the new value of x
y + ~-d % 2 // the new value of y
) // end of recursive call
: // else (we've found a valid path):
++n, // increment n
x // \_ either way,
] = 1 // / do r[x] = 1 to restore the current cell to 1
) // end of map() over directions
), // end of map() over the cells of the current row
n = 0 // start with n = 0
) | n / 4 // end of map() over the rows; return n / 4