def read_data(): a = [] for i in range(4): row = list(map(int, input().split())) a.append(row) return a def solve(a): init = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,0]] moved = [False] * 16 r, c = 3, 3 return dfs(a, init, moved, r, c) def dfs(goal, status, moved, r, c): if goal == status: return True for nr, nc in [(r+1, c), (r-1, c), (r, c+1), (r, c-1)]: if nr > 3 or nr < 0 or nc > 3 or nc < 0: continue num = status[nr][nc] if moved[num]: continue status[nr][nc] = 0 status[r][c] = num moved[num] = True if dfs(goal, status, moved, nr, nc): return True moved[num] = False status[r][c] = 0 status[nr][nc] = num return False a = read_data() if solve(a): print('Yes') else: print('No')