Advertisement
Guest User

logic

a guest
May 29th, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.01 KB | None | 0 0
  1. '''words = [((0, 3), 0, 4), ((0, 5), 0, 3), ((1, 0), 0, 3), ((1, 0), 1, 7), ((3, 0), 1, 5)] # места для слов из функции new_view
  2. n = 4 # кол-во строк
  3. m = 7 # столбцов
  4. l_words = ["лето", 'баг', 'лето', 'код', 'бегемот', 'газон']
  5. '''
  6.  
  7.  
  8. parser = None
  9.  
  10. class Logic:
  11.     parser = None
  12.     words = None
  13.     l_words = None
  14.     n = None
  15.     m = None
  16.  
  17.     def __init__(self, parser_argument):
  18.         parser = parser_argument
  19.         words = parser.stat_geometry
  20.         l_words = parser.source_word
  21.         n = len(parser.geometry)
  22.         m = len(parser.geometry[0])
  23.  
  24.     def get_next_word(self, word_length, num_current_word): # возвращает слово-кандидат и его позицию в words
  25.         for i in range(num_current_word+1, len(l_words)):
  26.             if len(l_words[i]) == word_length:
  27.                 return(i, l_words[i])
  28.      
  29.     def fill(self):
  30.  
  31.         mat = [['_' for i in range(m)] for i in range(n)]
  32.         stack = [] # здесь будут координаты слов и направление
  33.         i = 0
  34.         num_current_word = -1
  35.         while i < len(words):
  36.             (x, y) = words[i][0] # в x, y координаты начала
  37.             vector = words[i][1] # направление
  38.             word_length = words[i][2]
  39.             next_word = get_next_word(word_length, num_current_word)
  40.             if next_word is None: # если никак нельзя на данном шаге кроссворд продолжить
  41.                 if i == 0: # если мы при этом на первом шаге
  42.                     return 0 # кроссворд заполнить не сможем
  43.                 changed_pos, num_current_word = stack.pop() # вытаскиваем из стека измененные на предыдущем шаге буквы и номер вставленного слова
  44.                 for p in changed_pos:
  45.                     mat[p[0]][p[1]] = '_'
  46.                 i -= 1 # возвращаемся на предыдущий шаг
  47.                 continue
  48.             num_current_word, string = next_word
  49.             changed_pos = [] # обнуляем список измененных позиций
  50.             if vector == 1: # направление: горизонталь
  51.                 for j in range(word_length):
  52.                     if mat[x][y+j] == '_': # если клетка кроссворда не заполнена
  53.                         mat[x][y+j] = string[j] # пишем туда следующую букву
  54.                         changed_pos.append((x, y+j)) # запоминаем измененную позицию
  55.                     elif mat[x][y+j] != string[j]: # если заполнена и буква там не та
  56.                         for p in changed_pos:
  57.                             mat[p[0]][p[1]] = '_' # стираем все измененные буквы
  58.                         break
  59.                 if j == word_length-1: # если вдруг смогли дописать слово до конца
  60.                     stack.append((changed_pos, num_current_word))
  61.                     i += 1
  62.                     num_current_word = -1
  63.             else:
  64.                 for j in range(word_length):
  65.                     if mat[x+j][y] == '_':
  66.                         mat[x+j][y] = string[j]
  67.                         changed_pos.append((x+j, y))
  68.                     elif mat[x+j][y] != string[j]:
  69.                         for p in changed_pos:
  70.                             mat[p[0]][p[1]] = '_'
  71.                         break
  72.                 if j == word_length-1:
  73.                     stack.append((changed_pos, num_current_word))
  74.                     i += 1
  75.                     num_current_word = -1
  76.         return mat
  77.  
  78.  
  79. if __name__ == '__main__':
  80.     result = fill(words)
  81.     if not result  == 0:
  82.         for s in result:
  83.             print(''.join(s))
  84.     else:
  85.         print("vse fignja")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement