From fd8d08c17d84193d2bd195f0914e223b0565f87b Mon Sep 17 00:00:00 2001 From: Michael Mutote <130656746+mr1Michael@users.noreply.github.com> Date: Sun, 12 Nov 2023 14:14:52 +0100 Subject: [PATCH] 22202956 ex 4.9 q 4 had to be made into backtracking --- 4_9_Exercises/Question 4.py | 50 ++++++++++++++++++++++----- Search_Algorithms/solution testing.py | 19 +++++----- 2 files changed, 51 insertions(+), 18 deletions(-) diff --git a/4_9_Exercises/Question 4.py b/4_9_Exercises/Question 4.py index 447be83..119f617 100644 --- a/4_9_Exercises/Question 4.py +++ b/4_9_Exercises/Question 4.py @@ -1,4 +1,28 @@ -def np(x, y, trace=None): +import time + + +def np(x, y): + trace = [[(0, 0)]] + final = [] + while trace: + new_pos = [] + current = trace.pop(-1) + last_position = current[-1] + if last_position == (x, y): + final.append(current) + else: + new_pos.append((last_position[0] + 1, last_position[1])) + new_pos.append((last_position[0], last_position[1] + 1)) + new_pos.append((last_position[0] - 1, last_position[1])) + new_pos.append((last_position[0], last_position[1] - 1)) + for pos in new_pos: + if (pos not in current) and ((0 <= pos[0] <= x) and (0 <= pos[1] <= y)): + trace.append(current + [pos]) + return final + + +def np2(x, y, trace=None): + # Old version was done by recursion and is functional if trace is None: trace = [(0, 0)] current = trace[-1] @@ -7,13 +31,9 @@ def np(x, y, trace=None): if current[0] > x or current[1] > y or current[0] < 0 or current[1] < 0: return 0 if (current[0], current[1]) == (x, y) and len(trace) > 1: - # print(current[0], x, current[1], y, " this is in success") - # print(trace) return 1 if x + y < 2: return 1 - # if (x, y) in new_cache: - # return new_cache[(x, y)] x_1, y_1 = (current[0], current[1] + 1) if current[1] < y else (current[0], current[1]) x_2, y_2 = (current[0] + 1, current[1]) if current[0] < x else (current[0], current[1]) x_3, y_3 = current[0] - 1, current[1] @@ -24,7 +44,19 @@ def np(x, y, trace=None): trace_3 = trace + [(x_3, y_3)] trace_4 = trace + [(x_4, y_4)] - return np(x, y, trace_1) + \ - np(x, y, trace_2) + \ - np(x, y, trace_3) + \ - np(x, y, trace_4) + return np2(x, y, trace_1) + \ + np2(x, y, trace_2) + \ + np2(x, y, trace_3) + \ + np2(x, y, trace_4) + + + +# for fun, I timed the two to see which is faster. both almost the same +# start_time = time.time() +# np2(3, 7) +# end_time = time.time() +# print(end_time - start_time) +# start_time = time.time() +# np(3, 7) +# end_time = time.time() +# print(end_time - start_time) diff --git a/Search_Algorithms/solution testing.py b/Search_Algorithms/solution testing.py index 6a537e2..c13ba3f 100644 --- a/Search_Algorithms/solution testing.py +++ b/Search_Algorithms/solution testing.py @@ -30,15 +30,16 @@ for rows in sln: print(rows) # N Queens -board = ((False, False, False, False, False, False, False, False, False), - (False, False, False, False, False, False, False, False, False), - (False, False, False, False, False, False, False, False, False), - (False, False, False, False, False, False, False, False, False), - (False, False, False, False, False, False, False, False, False), - (False, False, False, False, False, False, False, False, False), - (False, False, False, False, False, False, False, False, False), - (False, False, False, False, False, False, False, False, False), - (False, False, False, False, False, False, False, False, False)) +board = ((False, False, False, False, False, False, False, False, False, False), + (False, False, False, False, False, False, False, False, False, False), + (False, False, False, False, False, False, False, False, False, False), + (False, False, False, False, False, False, False, False, False, False), + (False, False, False, False, False, False, False, False, False, False), + (False, False, False, False, False, False, False, False, False, False), + (False, False, False, False, False, False, False, False, False, False), + (False, False, False, False, False, False, False, False, False, False), + (False, False, False, False, False, False, False, False, False, False), + (False, False, False, False, False, False, False, False, False, False)) sln = (Search_Algorithms.BreadthFirstSearch(board, Sucessors.queens_successor, is_goal.is_goal_queens)[-1]) -- GitLab