Guest User

Untitled

a guest
May 12th, 2018
224
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.85 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. import os, sys
  3.  
  4. # Reading all input as array:
  5. arr = [[int (x) for x in s.split()] for s in sys.stdin.read().split('\n')]
  6.  
  7. # Copy size of array:
  8. n = arr[0][0]
  9. arr = arr[1:]
  10.  
  11. # Copy:
  12. def copy(a):
  13.     return a#.copy()
  14.        
  15. # Struct Record:
  16. class Record:
  17.    
  18.     def __init__(self, dist = 10000, count = 2, row = -1, col = -1):
  19.         self.dist, self.count, self.row, self.col = dist, count, row, col
  20.    
  21.     def copy(self):
  22. #return Record(**self.__dict__)
  23.         return Record(self.dist, self.count, self.row, self.col)
  24.    
  25.     def inc(self):
  26.         return Record(self.dist + 1, self.count, self.row, self.col)
  27.  
  28. # Combine two records:
  29. def combine(a, b):
  30.     if (a.dist < b.dist):
  31.         return (a)
  32.     elif (a.dist > b.dist):
  33.         return (b)
  34.     elif a.row == b.row and a.col == b.col:
  35.         return (a)
  36.     else:
  37.         return Record(a.dist, a.count + b.count, -1, -1)    
  38.    
  39. # 2-D arrays:
  40. best_l_u = [[Record() for _ in range(n)] for _ in range(n)]
  41. best_l_d = [[Record() for _ in range(n)] for _ in range(n)]
  42. best_r_u = [[Record() for _ in range(n)] for _ in range(n)]
  43. best_r_d = [[Record() for _ in range(n)] for _ in range(n)]
  44.  
  45. for i in range(n):
  46.     for j in range(n):
  47.         if (arr[i][j] != 0):
  48.             best_l_u[i][j] = Record(0, 1, i, j)
  49.             best_l_d[i][j] = Record(0, 1, i, j)
  50.             best_r_u[i][j] = Record(0, 1, i, j)
  51.             best_r_d[i][j] = Record(0, 1, i, j)
  52.  
  53. # Walk from left-up corner:
  54. for i in range(1, n):
  55.     best_l_u[i][0] = Record(0, 1, i, 0) if (arr[i][0] != 0) else (best_l_u[i-1][0]).inc()
  56.  
  57. for j in range(1, n):
  58.     best_l_u[0][j] = Record(0, 1, 0, j) if (arr[0][j] != 0) else (best_l_u[0][j-1]).inc()
  59.    
  60. for i in range(1, n):
  61.     for j in range(1, n):
  62.         temp = combine(best_l_u[i-1][j], best_l_u[i][j-1]).inc()
  63.         if (temp.dist < best_l_u[i][j].dist):
  64.             best_l_u[i][j] = temp
  65.  
  66. # Walk from left-down corner:
  67. for i in range(n-2, -1, -1):
  68.     best_l_d[i][0] = Record(0, 1, i, 0) if (arr[i][0] != 0) else (best_l_d[i+1][0]).inc()
  69.  
  70. for j in range(1, n):
  71.     best_l_d[n-1][j] = Record(0, 1, n-1, j) if (arr[n-1][j] != 0) else (best_l_d[n-1][j-1]).inc()
  72.  
  73. for i in range(n-2, -1, -1):
  74.     for j in range(1, n):
  75.         temp = combine(best_l_d[i+1][j], best_l_d[i][j-1]).inc()
  76.         if (temp.dist < best_l_d[i][j].dist):
  77.             best_l_d[i][j] = temp
  78.  
  79. # Walk from right-down corner:
  80. for i in range(n-2, -1, -1):
  81.     best_r_d[i][n-1] = Record(0, 1, i, n-1) if (arr[i][n-1] != 0) else (best_r_d[i+1][n-1]).inc()
  82.  
  83. for j in range(n-2, -1, -1):
  84.     best_r_d[n-1][j] = Record(0, 1, n-1, j) if (arr[n-1][j] != 0) else (best_r_d[n-1][j+1]).inc()
  85.    
  86. for i in range(n-2, -1, -1):
  87.     for j in range(n-2, -1, -1):
  88.         temp = combine(best_r_d[i+1][j], best_r_d[i][j+1]).inc()
  89.         if (temp.dist < best_r_d[i][j].dist):
  90.             best_r_d[i][j] = temp
  91.  
  92. # Walk from right-up corner:
  93. for i in range(1, n):
  94.     best_r_u[i][n-1] = Record(0, 1, i, n-1) if (arr[i][n-1] != 0) else (best_r_u[i-1][n-1]).inc()
  95.    
  96. for j in range(n-2, -1, -1):
  97.     best_r_u[0][j] = Record(0, 1, 0, j) if (arr[0][j] != 0) else (best_r_u[0][j+1]).inc()
  98.    
  99. for i in range(1, n):
  100.     for j in range(n-2, -1, -1):
  101.         temp = combine(best_r_u[i-1][j], best_r_u[i][j+1]).inc();
  102.         if (temp.dist < best_r_u[i][j].dist):
  103.             best_r_u[i][j] = temp
  104.  
  105. # Combine answers for each corners:
  106. for i in range(0, n):
  107.     for j in range(0, n):
  108.         if (arr[i][j] == 0):
  109.             best = combine(combine(best_l_u[i][j], best_r_u[i][j]), combine(best_l_d[i][j], best_r_d[i][j]))
  110.             if (best.count == 1):
  111.                 arr[i][j] = arr[best.row][best.col]
  112.  
  113. # Creating string for fast output:
  114. s_out = ""
  115. for row in arr:
  116.     for x in row:
  117.         s_out += str(x) + " ";
  118.     s_out += "\n"
  119.  
  120. # Fast output:
  121. #os.write(1, s_out.encode())
Advertisement
Add Comment
Please, Sign In to add comment