.......E <-end
........
........
........
........
........
........
S....... <-start
दुर्भाग्य से आप उपयोग नहीं कर सकते "किसी भी मानक पथ खोजने एल्गोरिथ्म" क्योंकि आपके पथ कम से कम-पथ नहीं हो सकता है। आपको विशेष रूप से एक बेवकूफ खोज का उपयोग करना होगा जो सभी पथों (गहराई-प्रथम या चौड़ाई-पहले, उदाहरण के लिए) माना जाता है।
हालांकि, आप पर कोई परवाह नहीं है कैसे आप एक टाइल करने के लिए मिला है, तो आप एक तकनीक गतिशील प्रोग्रामिंग कहा जाता है का उपयोग कर सकते हैं। हर स्थान (i, j) के लिए, तरीकों की संख्या n चाल है (यह तरीके i, j (एन) कॉल) में वहां पहुंचने के लिए:
तरीके i, j (एन) = तरीके i-1, जे (n-1) + तरीके i + 1, जे (n-1) + तरीके i, j-1 (n-1) + तरीके मैं, जे + 1 (एन -1) + तरीके i + 1, j + 1 (एन -1) + तरीके i-1, j + 1 (n-1) + तरीके i + 1, जे -1 (n-1) + तरीके i-1, जे -1 (एन-1)
अर्थात, राजा 1 में आसन्न वर्गों में से किसी से स्थानांतरित कर सकते हैं ले जाने के:
तरीके i, j (एन) = योग पड़ोसियों (i, j) (तरीके पड़ोसी (एन-1))
इस प्रकार आप करना चाहते हैं, उदाहरण के लिए पायथन में:
SIZE = 8
cache = {}
def ways(pos, n):
r,c = pos # row,column
if not (0<=r<SIZE and 0<=c<SIZE):
# off edge of board: no ways to get here
return 0
elif n==0:
# starting position: only one way to get here
return 1 if (r,c)==(0,0) else 0
else:
args = (pos,n)
if not args in cache:
cache[args] = ways((r-1,c), n-1) + ways((r+1,c), n-1) + ways((r,c-1), n-1) + ways((r,c+1), n-1) + ways((r-1,c-1), n-1) + ways((r+1,c-1), n-1) + ways((r+1,c-1), n-1) + ways((r+1,c+1), n-1)
return cache[args]
डेमो:
>>> ways((7,7), 15)
1074445298
ऊपर तकनीक Memoization कहा जाता है, और गतिशील प्रोग्रामिंग से लिखने के लिए है, क्योंकि आप वास्तव में जिस क्रम में आप बातें करते हैं के बारे में सोचने की जरूरत नहीं है सरल है।आप देख सकते हैं कैश बढ़ने के रूप में हम में अधिकाधिक महत्वपूर्ण प्रश्नों की एक श्रृंखला प्रदर्शन:
>>> cache
{}
>>> ways((1,0), 1)
1
>>> cache
{((1, 0), 1): 1}
>>> ways((1,1), 2)
2
>>> cache
{((0, 1), 1): 1, ((1, 2), 1): 0, ((1, 0), 1): 1, ((0, 0), 1): 0, ((2, 0), 1): 0, ((2, 1), 1): 0, ((1, 1), 2): 2, ((2, 2), 1): 0}
>>> ways((2,1), 3)
5
>>> cache
{((1, 2), 1): 0, ((2, 3), 1): 0, ((2, 0), 2): 1, ((1, 1), 1): 1, ((3, 1), 1): 0, ((4, 0), 1): 0, ((1, 0), 1): 1, ((3, 0), 1): 0, ((0, 0), 1): 0, ((2, 0), 1): 0, ((2, 1), 1): 0, ((4, 1), 1): 0, ((2, 2), 2): 1, ((3, 3), 1): 0, ((0, 1), 1): 1, ((3, 0), 2): 0, ((3, 2), 2): 0, ((3, 2), 1): 0, ((1, 0), 2): 1, ((4, 2), 1): 0, ((4, 3), 1): 0, ((3, 1), 2): 0, ((1, 1), 2): 2, ((2, 2), 1): 0, ((2, 1), 3): 5}
(अजगर में, यह भी एक @cached
या @memoized
डेकोरेटर का उपयोग पिछले else:
ब्लॉक में पूरे कोड लिखने के लिए होने से बचने कर सकते हैं। अन्य भाषाओं में स्वचालित रूप से ज्ञापन निष्पादन करने के अन्य तरीके हैं।)
उपर्युक्त शीर्ष-नीचे दृष्टिकोण था। यह कभी-कभी बहुत बड़े ढेर का उत्पादन कर सकता है (आपका ढेर n
के साथ बढ़ेगा)। यदि आप अनावश्यक काम से बचने के लिए सुपर-कुशल बनना चाहते हैं, तो आप नीचे-नीचे दृष्टिकोण कर सकते हैं, जहां आप राजा के सभी पदों का अनुकरण कर सकते हैं, 1 कदम, 2 कदम, 3 कदम, ...:
SIZE = 8
def ways(n):
grid = [[0 for row in range(8)] for col in range(8)]
grid[0][0] = 1
def inGrid(r,c):
return all(0<=coord<SIZE for coord in (r,c))
def adjacentSum(pos, grid):
r,c = pos
total = 0
for neighbor in [(1,0),(1,1),(0,1),(-1,1),(-1,0),(-1,-1),(0,-1),(1,-1)]:
delta_r,delta_c = neighbor
(r2,c2) = (r+delta_r,c+delta_c)
if inGrid(r2,c2):
total += grid[r2][c2]
return total
for _ in range(n):
grid = [[adjacentSum((r,c), grid) for r in range(8)] for c in range(8)]
# careful: grid must be replaced atomically, not element-by-element
from pprint import pprint
pprint(grid)
return grid
डेमो:
>>> ways(0)
[[1, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0]]
>>> ways(1)
[[0, 1, 0, 0, 0, 0, 0, 0],
[1, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0]]
>>> ways(2)
[[3, 2, 2, 0, 0, 0, 0, 0],
[2, 2, 2, 0, 0, 0, 0, 0],
[2, 2, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0]]
>>> ways(3)
[[6, 11, 6, 4, 0, 0, 0, 0],
[11, 16, 9, 5, 0, 0, 0, 0],
[6, 9, 6, 3, 0, 0, 0, 0],
[4, 5, 3, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0]]
>>> ways(4)
[[38, 48, 45, 20, 9, 0, 0, 0],
[48, 64, 60, 28, 12, 0, 0, 0],
[45, 60, 51, 24, 9, 0, 0, 0],
[20, 28, 24, 12, 4, 0, 0, 0],
[9, 12, 9, 4, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0]]
एक पूर्णांक अतिप्रवाह यहाँ के साथ बहुत सावधान होने की जरूरत है। 15 चालें 32 बिट्स बह जाएंगी और 25 चाल 64 बिट्स बह जाएंगी। –