function is_drivable(start, finish, grid): queue = [(start, 1)] # start cell with probability 1 visited = set() while queue is not empty: current_cell, prob = queue.pop(0) if current_cell == finish and prob >= 1 - 1e-100: return True # finish cell reached with sufficient probability for next_cell in neighboring_cells(current_cell, grid): if next_cell not in visited: visited.add(next_cell) queue.append((next_cell, prob * 0.5)) # equal probability of misinterpretation return False # finish cell not reachable with sufficient probability # Main function for each test case: R, C, grid = parse_input() drivable_pairs = [] for start_cell in interesting_start_cells: for finish_cell in interesting_finish_cells: if is_drivable(start_cell, finish_cell, grid): drivable_pairs.append((start_cell, finish_cell)) if len(drivable_pairs) == 0: print("Case #{}: NONE".format(test_case_number)) else: sorted_drivable_pairs = sort_drivable_pairs(drivable_pairs) print("Case #{}: {}".format(test_case_number, " ".join(sorted_drivable_pairs)))