Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- '''words = [((0, 3), 0, 4), ((0, 5), 0, 3), ((1, 0), 0, 3), ((1, 0), 1, 7), ((3, 0), 1, 5)] # места для слов из функции new_view
- n = 4 # кол-во строк
- m = 7 # столбцов
- l_words = ["лето", 'баг', 'лето', 'код', 'бегемот', 'газон']
- '''
- parser = None
- class Logic:
- parser = None
- words = None
- l_words = None
- n = None
- m = None
- def __init__(self, parser_argument):
- parser = parser_argument
- words = parser.stat_geometry
- l_words = parser.source_word
- n = len(parser.geometry)
- m = len(parser.geometry[0])
- def get_next_word(self, word_length, num_current_word): # возвращает слово-кандидат и его позицию в words
- for i in range(num_current_word+1, len(l_words)):
- if len(l_words[i]) == word_length:
- return(i, l_words[i])
- def fill(self):
- mat = [['_' for i in range(m)] for i in range(n)]
- stack = [] # здесь будут координаты слов и направление
- i = 0
- num_current_word = -1
- while i < len(words):
- (x, y) = words[i][0] # в x, y координаты начала
- vector = words[i][1] # направление
- word_length = words[i][2]
- next_word = get_next_word(word_length, num_current_word)
- if next_word is None: # если никак нельзя на данном шаге кроссворд продолжить
- if i == 0: # если мы при этом на первом шаге
- return 0 # кроссворд заполнить не сможем
- changed_pos, num_current_word = stack.pop() # вытаскиваем из стека измененные на предыдущем шаге буквы и номер вставленного слова
- for p in changed_pos:
- mat[p[0]][p[1]] = '_'
- i -= 1 # возвращаемся на предыдущий шаг
- continue
- num_current_word, string = next_word
- changed_pos = [] # обнуляем список измененных позиций
- if vector == 1: # направление: горизонталь
- for j in range(word_length):
- if mat[x][y+j] == '_': # если клетка кроссворда не заполнена
- mat[x][y+j] = string[j] # пишем туда следующую букву
- changed_pos.append((x, y+j)) # запоминаем измененную позицию
- elif mat[x][y+j] != string[j]: # если заполнена и буква там не та
- for p in changed_pos:
- mat[p[0]][p[1]] = '_' # стираем все измененные буквы
- break
- if j == word_length-1: # если вдруг смогли дописать слово до конца
- stack.append((changed_pos, num_current_word))
- i += 1
- num_current_word = -1
- else:
- for j in range(word_length):
- if mat[x+j][y] == '_':
- mat[x+j][y] = string[j]
- changed_pos.append((x+j, y))
- elif mat[x+j][y] != string[j]:
- for p in changed_pos:
- mat[p[0]][p[1]] = '_'
- break
- if j == word_length-1:
- stack.append((changed_pos, num_current_word))
- i += 1
- num_current_word = -1
- return mat
- if __name__ == '__main__':
- result = fill(words)
- if not result == 0:
- for s in result:
- print(''.join(s))
- else:
- print("vse fignja")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement