Advertisement
Guest User

Untitled

a guest
Feb 28th, 2020
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.02 KB | None | 0 0
  1.  
  2. def generate_board():
  3.     base = 3
  4.     side = base * base
  5.     def pattern(r,c): return (base * (r % base) + r // base + c) % (side)
  6.  
  7.     from random import sample
  8.     def shuffle(s): return sample(s,len(s))
  9.    
  10.     rBase = range(base)
  11.     rows  = [g * base + r for g in shuffle(rBase) for r in shuffle(rBase)]
  12.     cols  = [g * base + c for g in shuffle(rBase) for c in shuffle(rBase)]
  13.     nums  = shuffle(range(1,base * base + 1))
  14.     #nums = range(1,base*base+1)
  15.     board = [ [nums[pattern(r,c)] for c in cols] for r in rows ]
  16.  
  17.     squares = side * side
  18.     empties = squares * 3 // 4
  19.     for p in sample(range(squares), empties):
  20.         board[p // side][p % side] = 0
  21.  
  22.     return board
  23.  
  24. def print_board(b):
  25.     boardstr = ""
  26.     for i in range(9):
  27.         if i == 3 or i == 6:
  28.             boardstr += "---------------------\n"
  29.         for j in range(9):
  30.             boardstr += str(b[i][j]) + " "
  31.             if j == 8:
  32.                 boardstr += "\n"
  33.             if j == 2 or j == 5:
  34.                 boardstr += "| "
  35.     print(boardstr)
  36.  
  37. def is_valid_number(b, num, x, y):
  38.     for i in range(9):
  39.         if b[i][y] == num:
  40.             return False
  41.     for j in range(9):
  42.         if b[x][j] == num:
  43.             return False
  44.     for i in range(3):
  45.         for j in range(3):
  46.             if b[(x // 3) * 3 + i][(y // 3) * 3 + j] == num:
  47.                 return False
  48.     return True
  49.  
  50. def next_valid_position(b):
  51.     for i in range(9):
  52.         for j in range(9):
  53.             if b[i][j] == 0:
  54.                 return (i, j)
  55.     return True
  56.  
  57. def solve_board(b):
  58.     if next_valid_position(b) != True:
  59.         x, y = next_valid_position(b)
  60.        
  61.         for i in range(1, 10):
  62.             if is_valid_number(b, i, x, y):
  63.                 board[x][y] = i
  64.                 solve_board(board)
  65.         board[x][y] = 0
  66.     else:
  67.         print("Board solved!\n")
  68.         print_board(board)
  69.         return
  70.  
  71. print("Generating Board...\n")
  72. board = generate_board()
  73. print_board(board)
  74. solve_board(board)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement