рд╕реБрдбреЛрдХреВ рдкреАрдврд╝реА рдПрд▓реНрдЧреЛрд░рд┐рдердо

sudoku250title
рдЖрдкрдХрд╛ рджрд┐рди рд╢реБрдн рд╣реЛ!

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реБрдбреЛрдХреВ рдкрд╣реЗрд▓реА рдХреЛ рдХрд┐рд╕реА рдкрд░рд┐рдЪрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдо рдореЗрдВ рд╕реЗ рдХрдИ рд▓реЛрдЧ рдЙрд╕рдХреЗ рдлреИрд╕рд▓реЗ рдХреЗ рдкреАрдЫреЗ рдмрд╣реБрдд рд╕рдордп рдмрд┐рддрд╛рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЖрдкрдХреЛ рд╕рдбрд╝рдХ рдкрд░ рд╕рдордп рдХреЛ рдорд╛рд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдпрд╛ рдмрд╕ рдЕрдкрдиреЗ рджрд┐рдорд╛рдЧ рдХреЛ рдШреБрдорд╛рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╡реЗ рд╕реВрдЦ рди рдЬрд╛рдПрдВред рдПрдХ рд╣рдмреНрд░ рдкрд░ рдкрд╣реЗрд▓реА рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╛рдлреА рдкреЛрд╕реНрдЯ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЬрдм рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдПрдХ рджрд░реНрдЬрди, рдпрд╛ рд╢рд╛рдпрдж рд╕реМ рдкрд╣реЗрд▓рд┐рдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдЬрд┐рдЬреНрдЮрд╛рд╕реБ рджрд┐рдорд╛рдЧ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЦреБрдж рд╕реЗ рд╕рд╡рд╛рд▓ рдкреВрдЫрддрд╛ рд╣реИ: тАЬрд╕реБрдбреЛрдХреВ рддрд╛рд▓рд┐рдХрд╛ рдПрдХ рдЕрдиреВрдард╛ рд╕рдорд╛рдзрд╛рди рдХреИрд╕реЗ рд╣реИ? рдФрд░ рдЖрдк 9x9 рдЧреНрд░рд┐рдб рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╡рд░реНрдгрди рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? "

рдЙрдкрд░реЛрдХреНрдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛рдлреА рддрд╛рд░реНрдХрд┐рдХ рд╣реИред рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдХрд╛рдо рд╡рд░реНрдгрди рдХрд░рдирд╛ рдФрд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдерд╛ред рдпрд╣ рд╕рдм рдХрдЯ рдХреЗ рдиреАрдЪреЗ рд▓рд┐рдЦрд╛ рд╣реИред

рдмреБрдирд┐рдпрд╛рджреА рд╕реБрдбреЛрдХреВ рдирд┐рдпрдо
  1. рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддреА рд╣реИ
  2. рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓рдо рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддреА рд╣реИ
  3. рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддреА рд╣реИ (рдХреНрд╖реЗрддреНрд░ 3x3 рднреБрдЬрд╛ рд╡рд╛рд▓рд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╡рд░реНрдЧ рд╣реИ, рдЬреЛ рдиреАрдЪреЗ рджреА рдЧрдИ рдЫрд╡рд┐ рдореЗрдВ рдмреИрдВрдЧрдиреА рдореЗрдВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)




рдЪрд░рдг 1. рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдореВрд▓ рдЧреНрд░рд┐рдб рд▓реЗрдВ


рдЧреНрд░рд┐рдб рдХреЛ рд╕реБрдбреЛрдХреВ рдирд┐рдпрдореЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ 1 2 ... 8 9 рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ, рдиреАрдЪреЗ рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╣рдо 3 рдкрджреЛрдВ рд╕реЗ рдмрд╛рдИрдВ рдУрд░ рд╢рд┐рдлреНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддред 4 5 ... 2 3 рдФрд░ 7 8 ... 5 6ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд▓реЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд▓рдВрдмрд╡рдд рд░реВрдк рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реБрдП, рд╣рдо рдкрд┐рдЫрд▓реЗ рд╕реНрдерд╛рди рдкрд░ 1 рд╕реНрдерд┐рддрд┐ рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред

рдЕрдВрдд рдореЗрдВ, рдЖрдкрдХреЛ рдРрд╕рд╛ рдПрдХ рдЧреНрд░рд┐рдб рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдореИрдВ рдЗрд╕реЗ рдЖрдзрд╛рд░ рдХрд╣реВрдБрдЧрд╛:


рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЧреНрд░рд┐рдб рд╡рд░реНрдЧ рдмрдирд╛рдПрдВред рдЪрд░рдг 1 рдХреЗ рдЕрдиреБрд╕рд╛рд░ рднрд░реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛ рддрд╛рд▓рд┐рдХрд╛ рдорд╛рдиреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ, рд╢реЛ рд╡рд┐рдзрд┐ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рд╕рд┐рд░реНрдл рдПрдХ рджреГрд╢реНрдп рдЖрдЙрдЯрдкреБрдЯ рд╣реИред

class grid: def __init__(self,n = 3): """Generation of the base table""" self.n = n self.table = [[((i*n + i/n + j) % (n*n) + 1) for j in range(n*n)] for i in range(n*n)] print "The base table is ready!" def __del__(self): pass def show(self): for i in range(self.n*self.n): print self.table[i] 

рдЪрд░рдг 2. рдЧреНрд░рд┐рдб рдХреЛ рд╢рдлрд╝рд▓ рдХрд░реЗрдВ


рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╕реБрдбреЛрдХреВ рддрд╛рд▓рд┐рдХрд╛ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд░рд╣реЗрдЧреАред
рдЗрдирдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:










рдкреНрд░рддреНрдпреЗрдХ рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╡рд┐рдзрд┐ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
рд╕реБрд░

  def transposing(self): """ Transposing the whole grid """ self.table = map(list, zip(*self.table)) 

swap_rows_small

  def swap_rows_small(self): """ Swap the two rows """ area = random.randrange(0,self.n,1) line1 = random.randrange(0,self.n,1) #      N1 = area*self.n + line1 # 1    line2 = random.randrange(0,self.n,1) while (line1 == line2): line2 = random.randrange(0,self.n,1) N2 = area*self.n + line2 # 2    self.table[N1],self.table[N2] = self.table[N2], self.table[N1] 

swap_colums_small

рд╕реНрддрдВрднреЛрдВ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдкрд░рд┐рд╡рд░реНрддрд┐рдд рддрд╛рд▓рд┐рдХрд╛ рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ:
  def swap_colums_small(self): grid.transposing(self) grid.swap_rows_small(self) grid.transposing(self) 

swap_rows_area

  def swap_rows_area(self): """ Swap the two area horizon """ area1 = random.randrange(0,self.n,1) #   area2 = random.randrange(0,self.n,1) while (area1 == area2): area2 = random.randrange(0,self.n,1) for i in range(0, self.n): N1, N2 = area1*self.n + i, area2*self.n + i self.table[N1], self.table[N2] = self.table[N2], self.table[N1] 

swap_colums_area

  def swap_colums_small(self): grid.transposing(self) grid.swap_rows_area(self) grid.transposing(self) 

рдФрд░ рднреА рдЬрдЯрд┐рд▓ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдЗрди рддрдХ рд╕реАрдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдврд╛рдВрдЪрд╛ рдЗрд╕рдХреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИ , рдРрд╕реЗ рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди рд▓рдЧрднрдЧ рдЙрд╕реА рддрд░рд╣ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдореИрдЯреНрд░рд┐рд╕реЗрд╕ рдкрд░ рд░реБрдмрд┐рдХ рдХреЗ рдХреНрдпреВрдм рдХреЗ рдирд┐рд░реНрдзрд╛рд░рдХ рдпрд╛ рд░реЛрдЯреЗрд╢рди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВред

рдЕрдм, рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдпреЛрдЬрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреНрд░рдо рдореЗрдВ рдлреЗрд░рдмрджрд▓ рдлрд╝рдВрдХреНрд╢рди рдЪрд▓рд╛рдПрдВред рддреЛ рдпрд╣ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдорд┐рд╢реНрд░рдг рдХреА рдорд╛рддреНрд░рд╛ рд╣реИ:
  def mix(self,amt = 10): mix_func = ['self.transposing()', 'self.swap_rows_small()', 'self.swap_colums_small()', 'self.swap_rows_area()', 'self.swap_colums_area()'] for i in xrange(1, amt): id_func = random.randrange(0,len(mix_func),1) eval(mix_func[id_func]) 

рдЙрджрд╛рд╣рд░рдг 10 рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдорд┐рд╢реНрд░рдг
 base [1, 2, 3, 4, 5, 6, 7, 8, 9] [4, 5, 6, 7, 8, 9, 1, 2, 3] [7, 8, 9, 1, 2, 3, 4, 5, 6] [2, 3, 4, 5, 6, 7, 8, 9, 1] [5, 6, 7, 8, 9, 1, 2, 3, 4] [8, 9, 1, 2, 3, 4, 5, 6, 7] [3, 4, 5, 6, 7, 8, 9, 1, 2] [6, 7, 8, 9, 1, 2, 3, 4, 5] [9, 1, 2, 3, 4, 5, 6, 7, 8] swap_colums_area [7, 8, 9, 4, 5, 6, 1, 2, 3] [1, 2, 3, 7, 8, 9, 4, 5, 6] [4, 5, 6, 1, 2, 3, 7, 8, 9] [8, 9, 1, 5, 6, 7, 2, 3, 4] [2, 3, 4, 8, 9, 1, 5, 6, 7] [5, 6, 7, 2, 3, 4, 8, 9, 1] [9, 1, 2, 6, 7, 8, 3, 4, 5] [3, 4, 5, 9, 1, 2, 6, 7, 8] [6, 7, 8, 3, 4, 5, 9, 1, 2] swap_colums_small [7, 8, 9, 4, 5, 6, 2, 1, 3] [1, 2, 3, 7, 8, 9, 5, 4, 6] [4, 5, 6, 1, 2, 3, 8, 7, 9] [8, 9, 1, 5, 6, 7, 3, 2, 4] [2, 3, 4, 8, 9, 1, 6, 5, 7] [5, 6, 7, 2, 3, 4, 9, 8, 1] [9, 1, 2, 6, 7, 8, 4, 3, 5] [3, 4, 5, 9, 1, 2, 7, 6, 8] [6, 7, 8, 3, 4, 5, 1, 9, 2] swap_colums_small [7, 8, 9, 4, 5, 6, 1, 2, 3] [1, 2, 3, 7, 8, 9, 4, 5, 6] [4, 5, 6, 1, 2, 3, 7, 8, 9] [8, 9, 1, 5, 6, 7, 2, 3, 4] [2, 3, 4, 8, 9, 1, 5, 6, 7] [5, 6, 7, 2, 3, 4, 8, 9, 1] [9, 1, 2, 6, 7, 8, 3, 4, 5] [3, 4, 5, 9, 1, 2, 6, 7, 8] [6, 7, 8, 3, 4, 5, 9, 1, 2] transposing [7, 1, 4, 8, 2, 5, 9, 3, 6] [8, 2, 5, 9, 3, 6, 1, 4, 7] [9, 3, 6, 1, 4, 7, 2, 5, 8] [4, 7, 1, 5, 8, 2, 6, 9, 3] [5, 8, 2, 6, 9, 3, 7, 1, 4] [6, 9, 3, 7, 1, 4, 8, 2, 5] [1, 4, 7, 2, 5, 8, 3, 6, 9] [2, 5, 8, 3, 6, 9, 4, 7, 1] [3, 6, 9, 4, 7, 1, 5, 8, 2] swap_colums_small [7, 1, 4, 8, 2, 5, 6, 3, 9] [8, 2, 5, 9, 3, 6, 7, 4, 1] [9, 3, 6, 1, 4, 7, 8, 5, 2] [4, 7, 1, 5, 8, 2, 3, 9, 6] [5, 8, 2, 6, 9, 3, 4, 1, 7] [6, 9, 3, 7, 1, 4, 5, 2, 8] [1, 4, 7, 2, 5, 8, 9, 6, 3] [2, 5, 8, 3, 6, 9, 1, 7, 4] [3, 6, 9, 4, 7, 1, 2, 8, 5] swap_rows_small [7, 1, 4, 8, 2, 5, 6, 3, 9] [8, 2, 5, 9, 3, 6, 7, 4, 1] [9, 3, 6, 1, 4, 7, 8, 5, 2] [5, 8, 2, 6, 9, 3, 4, 1, 7] [4, 7, 1, 5, 8, 2, 3, 9, 6] [6, 9, 3, 7, 1, 4, 5, 2, 8] [1, 4, 7, 2, 5, 8, 9, 6, 3] [2, 5, 8, 3, 6, 9, 1, 7, 4] [3, 6, 9, 4, 7, 1, 2, 8, 5] swap_rows_small [7, 1, 4, 8, 2, 5, 6, 3, 9] [8, 2, 5, 9, 3, 6, 7, 4, 1] [9, 3, 6, 1, 4, 7, 8, 5, 2] [5, 8, 2, 6, 9, 3, 4, 1, 7] [4, 7, 1, 5, 8, 2, 3, 9, 6] [6, 9, 3, 7, 1, 4, 5, 2, 8] [2, 5, 8, 3, 6, 9, 1, 7, 4] [1, 4, 7, 2, 5, 8, 9, 6, 3] [3, 6, 9, 4, 7, 1, 2, 8, 5] swap_rows_area [7, 1, 4, 8, 2, 5, 6, 3, 9] [8, 2, 5, 9, 3, 6, 7, 4, 1] [9, 3, 6, 1, 4, 7, 8, 5, 2] [2, 5, 8, 3, 6, 9, 1, 7, 4] [1, 4, 7, 2, 5, 8, 9, 6, 3] [3, 6, 9, 4, 7, 1, 2, 8, 5] [5, 8, 2, 6, 9, 3, 4, 1, 7] [4, 7, 1, 5, 8, 2, 3, 9, 6] [6, 9, 3, 7, 1, 4, 5, 2, 8] swap_colums_small [7, 1, 4, 8, 2, 5, 6, 9, 3] [8, 2, 5, 9, 3, 6, 7, 1, 4] [9, 3, 6, 1, 4, 7, 8, 2, 5] [2, 5, 8, 3, 6, 9, 1, 4, 7] [1, 4, 7, 2, 5, 8, 9, 3, 6] [3, 6, 9, 4, 7, 1, 2, 5, 8] [5, 8, 2, 6, 9, 3, 4, 7, 1] [4, 7, 1, 5, 8, 2, 3, 6, 9] [6, 9, 3, 7, 1, 4, 5, 8, 2] 


рдЪрд░рдг 3. рд╕реЗрд▓ рдирд┐рдХрд╛рд▓рдирд╛


рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдпрд╣ рдЗрд╕ рдХреНрд░рдо рдореЗрдВ рд╣реИ рдХрд┐ рд╣рдо рд╕рдорд╛рдзрд╛рди рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗ рд╕рдХрддреЗ рд╣реИрдВ)ред рдФрд░ рдпрд╣ рд╕рдмрд╕реЗ рдХрдард┐рди рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рд╕рдорд╛рдзрд╛рди рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рддрдирд╛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдпрд╣ рдЙрди рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░рдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬрд┐рди рдкрд░ рд╕реБрдбреЛрдХреВ рдЬрдЯрд┐рд▓рддрд╛ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред рд╕реБрдбреЛрдХреВ рдореЗрдВ 81 рдХреЛрд╢рд┐рдХрд╛рдПрдВ рд╣реИрдВ, рдЖрдорддреМрд░ рдкрд░ рдЖрд╕рд╛рди рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдХреНрд╖реЗрддреНрд░ рдкрд░ 30-35 "рдЯрд┐рдкреНрд╕" рд╣реЛрддреЗ рд╣реИрдВ, рдордзреНрдпрдо - 25-30, рдФрд░ рдореБрд╢реНрдХрд┐рд▓ - 20-25ред рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдПрдХ рдмрдбрд╝реЗ рд╕рдореВрд╣ рдХрд╛ рдбреЗрдЯрд╛ рд╣реИред рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдХрд╛рдиреВрди рдирд╣реАрдВ рд╣реИрдВред 30-рд╕реЗрд▓ рдЕрдШреБрд▓рдирд╢реАрд▓ рд╕рдВрд╕реНрдХрд░рдг рдФрд░ 22 рд╕реЗрд▓ "рдкреНрд░рдХрд╛рд╢" рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИред


рддреЛ, рдЪрд▓реЛ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ (рд╕рднреА рд╡рд┐рдХрд▓реНрдк рд╕рдорддреБрд▓реНрдп рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 81 рд╕реЗрд▓ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдкрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕рдВрдкреВрд░реНрдг рдЦреЛрдЬ рджреНрд╡рд╛рд░рд╛ рд╕рдм рдХреБрдЫ рдЬрд╛рдВрдЪ рд▓реЗрдВрдЧреЗ):

  1. рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕реЗрд▓ рдПрди рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ
  2. рдорд╛рд░реНрдХ рдПрди рдХреЛ рджреЗрдЦрд╛
  3. рд╣рдЯрд╛рдПрдБ N
  4. рдлреИрд╕рд▓реЗ рдЧрд┐рдирд╛рдПред рдпрджрд┐ рдпрд╣ рдЕрджреНрд╡рд┐рддреАрдп рдирд╣реАрдВ рд╣реИ, рддреЛ рдПрди рд╡рд╛рдкрд╕ рд▓реМрдЯреЗрдВ

рдЗрд╕ рдорд┐рд╢реНрд░рдг рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ рд╕рдмрд╕реЗ рдХрдард┐рди рд╕реБрдбреЛрдХреВ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рдЪрд░ рдХрдард┐рдирддрд╛ рдЬрдЯрд┐рд▓рддрд╛ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддреА рд╣реИ - рд╢реЗрд╖ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ред

 flook = [[0 for j in range(example.n*example.n)] for i in range(example.n*example.n)] iterator = 0 difficult = example.n ** 4 #     while iterator < example.n ** 4: i,j = random.randrange(0, example.n*example.n ,1), random.randrange(0, example.n*example.n ,1) #    if flook[i][j] == 0: #    iterator += 1 flook[i][j] = 1 # temp = example.table[i][j] #             example.table[i][j] = 0 difficult -= 1 #,    table_solution = [] for copy_i in range(0, example.n*example.n): table_solution.append(example.table[copy_i][:]) #    i_solution = 0 for solution in solver.solve_sudoku((example.n, example.n), table_solution): i_solution += 1 #   if i_solution != 1: #    --    example.table[i][j] = temp difficult += 1 # example.show() print "difficult = ",difficult 


sudoku_generator.py
 # coding=utf-8 import random import solver class grid: def __init__(self,n = 3): """ Generation of the base table """ self.n = n self.table = [[ ((i*n + i/n + j) % (n*n) + 1) for j in range(n*n)] for i in range(n*n)] print "The base table is ready!" def __del__(self): pass def show(self): for i in range(self.n*self.n): print self.table[i] def transposing(self): """ Transposing the whole grid """ self.table = map(list, zip(*self.table)) def swap_rows_small(self): """ Swap the two rows """ area = random.randrange(0,self.n,1) line1 = random.randrange(0,self.n,1) #      N1 = area*self.n + line1 # 1    line2 = random.randrange(0,self.n,1) # ,      while (line1 == line2): line2 = random.randrange(0,self.n,1) N2 = area*self.n + line2 # 2    self.table[N1],self.table[N2] = self.table[N2], self.table[N1] def swap_colums_small(self): grid.transposing(self) grid.swap_rows_small(self) grid.transposing(self) def swap_rows_area(self): """ Swap the two area horizon """ area1 = random.randrange(0,self.n,1) #   area2 = random.randrange(0,self.n,1) # ,      while (area1 == area2): area2 = random.randrange(0,self.n,1) for i in range(0, self.n): N1, N2 = area1*self.n + i, area2*self.n + i self.table[N1], self.table[N2] = self.table[N2], self.table[N1] def swap_colums_area(self): grid.transposing(self) grid.swap_rows_area(self) grid.transposing(self) def mix(self,amt = 10): mix_func = ['self.transposing()', 'self.swap_rows_small()', 'self.swap_colums_small()', 'self.swap_rows_area()', 'self.swap_colums_area()'] for i in xrange(1, amt): id_func = random.randrange(0,len(mix_func),1) eval(mix_func[id_func]) example = grid() example.mix() flook = [[0 for j in range(example.n*example.n)] for i in range(example.n*example.n)] iterator = 0 difficult = example.n ** 4 #     example.show() print "---------------------------" while iterator < example.n ** 4: i,j = random.randrange(0, example.n*example.n ,1), random.randrange(0, example.n*example.n ,1) #    if flook[i][j] == 0: #    iterator += 1 flook[i][j] = 1 # temp = example.table[i][j] #             example.table[i][j] = 0 difficult -= 1 #    table_solution = [] for copy_i in range(0, example.n*example.n): table_solution.append(example.table[copy_i][:]) #    i_solution = 0 for solution in solver.solve_sudoku((example.n, example.n), table_solution): i_solution += 1 #   if i_solution != 1: #       example.table[i][j] = temp difficult += 1 #  example.show() print "difficult = ",difficult 


solver.py
 #!/usr/bin/env python3 # Author: Ali Assaf <ali.assaf.mail@gmail.com> # Copyright: (C) 2010 Ali Assaf # License: GNU General Public License <http://www.gnu.org/licenses/> from itertools import product def solve_sudoku(size, grid): """ An efficient Sudoku solver using Algorithm X. >>> grid = [ ... [5, 3, 0, 0, 7, 0, 0, 0, 0], ... [6, 0, 0, 1, 9, 5, 0, 0, 0], ... [0, 9, 8, 0, 0, 0, 0, 6, 0], ... [8, 0, 0, 0, 6, 0, 0, 0, 3], ... [4, 0, 0, 8, 0, 3, 0, 0, 1], ... [7, 0, 0, 0, 2, 0, 0, 0, 6], ... [0, 6, 0, 0, 0, 0, 2, 8, 0], ... [0, 0, 0, 4, 1, 9, 0, 0, 5], ... [0, 0, 0, 0, 8, 0, 0, 7, 9]] >>> for solution in solve_sudoku((3, 3), grid): ... print(*solution, sep='\\n') [5, 3, 4, 6, 7, 8, 9, 1, 2] [6, 7, 2, 1, 9, 5, 3, 4, 8] [1, 9, 8, 3, 4, 2, 5, 6, 7] [8, 5, 9, 7, 6, 1, 4, 2, 3] [4, 2, 6, 8, 5, 3, 7, 9, 1] [7, 1, 3, 9, 2, 4, 8, 5, 6] [9, 6, 1, 5, 3, 7, 2, 8, 4] [2, 8, 7, 4, 1, 9, 6, 3, 5] [3, 4, 5, 2, 8, 6, 1, 7, 9] """ R, C = size N = R * C X = ([("rc", rc) for rc in product(range(N), range(N))] + [("rn", rn) for rn in product(range(N), range(1, N + 1))] + [("cn", cn) for cn in product(range(N), range(1, N + 1))] + [("bn", bn) for bn in product(range(N), range(1, N + 1))]) Y = dict() for r, c, n in product(range(N), range(N), range(1, N + 1)): b = (r // R) * R + (c // C) # Box number Y[(r, c, n)] = [ ("rc", (r, c)), ("rn", (r, n)), ("cn", (c, n)), ("bn", (b, n))] X, Y = exact_cover(X, Y) for i, row in enumerate(grid): for j, n in enumerate(row): if n: select(X, Y, (i, j, n)) for solution in solve(X, Y, []): for (r, c, n) in solution: grid[r][c] = n yield grid def exact_cover(X, Y): X = {j: set() for j in X} for i, row in Y.items(): for j in row: X[j].add(i) return X, Y def solve(X, Y, solution): if not X: yield list(solution) else: c = min(X, key=lambda c: len(X[c])) for r in list(X[c]): solution.append(r) cols = select(X, Y, r) for s in solve(X, Y, solution): yield s deselect(X, Y, r, cols) solution.pop() def select(X, Y, r): cols = [] for j in Y[r]: for i in X[j]: for k in Y[i]: if k != j: X[k].remove(i) cols.append(X.pop(j)) return cols def deselect(X, Y, r, cols): for j in reversed(Y[r]): X[j] = cols.pop() for i in X[j]: for k in Y[i]: if k != j: X[k].add(i) if __name__ == "__main__": import doctest doctest.testmod() 


рдХрд╛рдо рдХрд╛ рдирддреАрдЬрд╛
 The base table is ready! [5, 4, 6, 8, 7, 9, 2, 1, 3] [8, 7, 9, 2, 1, 3, 5, 4, 6] [2, 1, 3, 5, 4, 6, 8, 7, 9] [6, 5, 7, 9, 8, 1, 3, 2, 4] [9, 8, 1, 3, 2, 4, 6, 5, 7] [3, 2, 4, 6, 5, 7, 9, 8, 1] [7, 6, 8, 1, 9, 2, 4, 3, 5] [1, 9, 2, 4, 3, 5, 7, 6, 8] [4, 3, 5, 7, 6, 8, 1, 9, 2] --------------------------- [0, 0, 6, 0, 0, 0, 0, 0, 0] [8, 7, 0, 0, 1, 0, 0, 0, 6] [0, 0, 0, 5, 4, 0, 0, 0, 9] [6, 0, 0, 0, 8, 1, 3, 0, 4] [0, 0, 0, 3, 0, 0, 0, 5, 0] [0, 0, 0, 0, 0, 7, 0, 0, 0] [0, 0, 0, 0, 0, 0, 0, 0, 0] [0, 9, 0, 4, 0, 0, 0, 0, 8] [0, 0, 5, 0, 6, 0, 1, 0, 0] difficult = 22 


рдЬрд╝рд┐рдк рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ

рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рд╕реБрдбреЛрдХреВ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИрдВред рдореЗрд░рд╛ рд▓рдХреНрд╖реНрдп рд╣рд╛рд╕рд┐рд▓ рд╣реЛ рдЧрдпрд╛, рдореБрдЭреЗ рдПрдХ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдорд┐рд▓рд╛ред рдЕрдм рдореБрдЭреЗ рдирдИ рд░рд┐рд▓реАрдЬрд╝ рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ :)
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣рд╛рдВ рд╕реБрдбреЛрдХреВ 9x9 рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рдерд╛ред рд▓реЗрдХрд┐рди 16x16 рдФрд░ 25x25 рдкрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдкреНрд░рддрд┐рдмрдВрдз рдирд╣реАрдВ рд╣реИред


рдпрджрд┐ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рд╕реМрджреЗ рд╣реИрдВ - рдЯрд┐рдкреНрдкрдгреА рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

Source: https://habr.com/ru/post/In192102/


All Articles