#sudoku 9*9
# the sudoku list will contain sub-lists which contain rows in the form [[row 1], [row 2],..,[row 9]]
sud=[]
# creating the array
for i in range(9):
	sud.append([])
	for k in range(9):
		sud[i].append('#')
h=0
while True:
	a=raw_input('Give me the known in exactly this form  say for row 1: 1##2#7### , type done when you finish. \n >>>')
	if a.lower()=='done':
		break
	try:
		for i,j in enumerate(a):
			if j !='#':
				sud[h][i]=int(a[i])

	except:
		print' wrong format , type like 1,2=5'
	h+=1
#printing the sudoku table
row=range(9)
colmn=range(9)
def prt_sud():
	for i in range(9):
		print ''
		if i in [0,3,6]:
			print'|-------|-------|-------|'
		for k in range(9):
			if k in [0,3,6]:
				print '|',
			print sud[i][k],
			if k==8:
				print '|',
		if i ==8:
			print '\n|-------|-------|-------|',
#the given sudoku
print '_____(The Given sudoku)_____'
prt_sud()
print '\n','_____________________________'
def row_pos():
	#calculating numbers exist in each row
	for i in range (9):
		row[i]=[]
		for j in range(9):
			if sud[i][j]=='#' or type(sud[i][j])== list:

				pass
			else:
				row[i].append(sud[i][j])

	return row
def col_pos():
	# calculating the numbers exist in each column
	for i in range(9):
		colmn[i]=[]
		for j in range(9):
			if sud[j][i]=='#'or type(sud[j][i])== list:

				pass
			else:
				colmn[i].append(sud[j][i])

	return colmn
def rc_poss():
	# calculating possisbilities for each cell by looking in the corresponding row and colomn
	for i in range(9):
		for j in range(9):
			a=0
			if type(sud[i][j])==list:
				sud[i][j]='#'
			if sud[i][j]!='#'  :
				continue
			else:
				sud[i][j]=[]
				a=col_pos()[j]+row_pos()[i]
				for l in range (1,10):
					if l in a:
						continue
					else:
						sud[i][j].append(l)

	return chk_list()
def chk_list():
	count=0
	cntint=0
	#chek for elements in sud that are lists of 1 possisbility convert them into int.
	for i in range(9):
		for j in range(9):
			if type(sud[i][j])==list:
				if len(sud[i][j])==1:
					sud[i][j]=sud[i][j][0]
					count+=1
	if count>0:
		return True
	else: return False
def end():
	cntint=0
	for i in sud:
		for j in i:
			if type(j)== int:
				cntint+=1
	if cntint == 81:
		return -1
def sud_square():
	sud_s=range(9)
	for i in range(9):
		sud_s[i]=[]
		for j in range(3):
			for k in range(3):
				sud_s[i].append(sud[j+(i/3)*3][k+(i%3)*3])
	return sud_s
def sudsubsqr_search():
	for i in range(9):
		for j in range(9):
			if type(sud[i][j])==int:
				continue
			for l in sud[i][j]:
				for k in range(1,9):
					if (i%3)*3+(j%3)+k >8:
						if l==sud_square()[(i/3)*3+j/3][(i%3)*3+(j%3)+k-8]:
							sud[i][j].remove(l)
							return chk_list()

					else:
						if l==sud_square()[(i/3)*3+j/3][(i%3)*3+(j%3)+k]:
							sud[i][j].remove(l)
							return chk_list()
def solve_sud():
	while True:
		while rc_poss():
			if end()==-1:
				print 'Vola!'
				return prt_sud()
		else:
			while not sudsubsqr_search():
				if end()==-1:
					print 'Vola!'
					return prt_sud()
			else:
				if end()==-1:
					print 'Vola!'
					return prt_sud()
solve_sud()
