Added all DAA in python
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
def solve_n_queens_with_first(n, first_pos, find_all=False):
|
||||
"""
|
||||
Solve n-Queens given a pre-placed queen at first_pos (r, c), 0-indexed.
|
||||
Returns:
|
||||
- if find_all=False: one solution as a list of rows where board[r][c] = 1
|
||||
- if find_all=True: list of all such solutions
|
||||
If no solution: returns None (or empty list when find_all=True).
|
||||
"""
|
||||
r0, c0 = first_pos
|
||||
# validate first position
|
||||
if not (0 <= r0 < n and 0 <= c0 < n):
|
||||
raise ValueError("first_pos must be within board bounds (0..n-1).")
|
||||
|
||||
# Prepare trackers
|
||||
cols = set([c0])
|
||||
diag1 = set([r0 - c0]) # r - c
|
||||
diag2 = set([r0 + c0]) # r + c
|
||||
board = [-1] * n # board[r] = c or -1
|
||||
board[r0] = c0
|
||||
|
||||
solutions = []
|
||||
|
||||
def place(row):
|
||||
# If row already has the placed queen, skip to next row
|
||||
if row == n:
|
||||
# a solution found; build matrix representation
|
||||
mat = [[0]*n for _ in range(n)]
|
||||
for rr in range(n):
|
||||
c = board[rr]
|
||||
if c != -1:
|
||||
mat[rr][c] = 1
|
||||
if find_all:
|
||||
solutions.append(mat)
|
||||
return False # continue searching
|
||||
else:
|
||||
solutions.append(mat)
|
||||
return True # stop search (found one)
|
||||
if board[row] != -1:
|
||||
# fixed queen row, just advance
|
||||
return place(row+1)
|
||||
|
||||
for c in range(n):
|
||||
if c in cols or (row - c) in diag1 or (row + c) in diag2:
|
||||
continue
|
||||
# choose
|
||||
board[row] = c
|
||||
cols.add(c); diag1.add(row - c); diag2.add(row + c)
|
||||
stop = place(row + 1)
|
||||
# unchoose
|
||||
cols.remove(c); diag1.remove(row - c); diag2.remove(row + c)
|
||||
board[row] = -1
|
||||
if stop and not find_all:
|
||||
return True
|
||||
return False
|
||||
|
||||
# Start from row 0
|
||||
place(0)
|
||||
|
||||
if find_all:
|
||||
return solutions # possibly empty list
|
||||
else:
|
||||
return solutions[0] if solutions else None
|
||||
|
||||
|
||||
# ---------- Example usage ----------
|
||||
if __name__ == "__main__":
|
||||
# Example 1: n=8, first queen at row0,col0 (top-left)
|
||||
n = 8
|
||||
first = (0, 0) # 0-indexed
|
||||
sol = solve_n_queens_with_first(n, first, find_all=False)
|
||||
if sol is None:
|
||||
print("No solution found.")
|
||||
else:
|
||||
print("One solution matrix (1 = queen):")
|
||||
for row in sol:
|
||||
print(row)
|
||||
|
||||
# Example 2: get all solutions with first queen at (0, 3)
|
||||
# all_sols = solve_n_queens_with_first(8, (0, 3), find_all=True)
|
||||
# print(f"Found {len(all_sols)} solutions.")
|
||||
Reference in New Issue
Block a user