Skip to content

Instantly share code, notes, and snippets.

@SohanChy
Created November 15, 2017 09:43
Show Gist options
  • Save SohanChy/f4c668d4cb07da90b899c92df0f43524 to your computer and use it in GitHub Desktop.
Save SohanChy/f4c668d4cb07da90b899c92df0f43524 to your computer and use it in GitHub Desktop.
N Puzzle Solvability
first_prob_arr =[
[6,1,10,2],
[7,11,4,14],
[5,None,9,15],
[8,12,13,3]
]
ex_prob_1 =[
[7,1,2],
[5,None,4],
[8,3,6]
]
ex_prob_2 =[
[6,1,10,2],
[7,11,4,14],
[5,None,9,15],
[8,12,13,3]
]
ex_prob_3 =[
[13,10,11,6],
[5,7,4,8],
[1,12,14,9],
[3,15,2,None]
]
# random.sample(range(1,16),15)
def flatten_list(list):
flat_list = []
for sublist in list:
for item in sublist:
if item is not None:
flat_list.append(item)
return flat_list
def count_inversion(item,flat_list,index):
inversion = 0
for i in range(index,len(flat_list)):
if( flat_list[i] < item ):
inversion += 1
return inversion
def get_blank_tile_row(prob_arr):
for row,sublist in enumerate(prob_arr):
for item in sublist:
if item is None:
return (len(prob_arr) - row)
def is_odd(num):
return num%2 != 0
def is_even(num):
return num%2 == 0
def is_solvable(prob_arr):
dim_x = len(prob_arr[0])
dim_y = len(prob_arr)
dim = dim_x
blank_tile_row = get_blank_tile_row(prob_arr)
flat_list = flatten_list(prob_arr)
inversion_map = {}
total_inversion = 0
for index, item in enumerate(flat_list):
inversion = count_inversion(item,flat_list,index)
total_inversion += inversion
inversion_map[item] = inversion
print("Blank tile row:",blank_tile_row);
print("Total Inversion:",total_inversion)
if( is_odd(dim) ):
if( is_even(dim) ):
print("Solvable: dimension odd, inversion even")
else:
print("Not Solvable: dimension odd, inversion odd")
else:
if is_odd(blank_tile_row) and is_even(total_inversion):
print("Solvable: dimension even, row odd inversion even")
elif is_even(blank_tile_row) and is_odd(total_inversion):
print("Solvable: dimension even, row even inversion odd")
else:
print("Not Solvable")
print()
import random
def get_random_prob(dim):
up = dim*dim
rnd = random.sample(range(0,up),up)
new_prob = []
row_num = 0
for i,item in enumerate(rnd):
row_num = i % dim
if(len(new_prob) - 1 < row_num):
new_prob.append([])
if item is 0:
new_prob[row_num].append(None)
else:
new_prob[row_num].append(item)
return new_prob
is_solvable(first_prob_arr)
is_solvable(ex_prob_1)
is_solvable(ex_prob_2)
is_solvable(ex_prob_3)
print()
is_solvable(get_random_prob(4))
@av1m
Copy link

av1m commented Apr 14, 2021

Line 105:
Replace

if item is 0:

To

if item == 0:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment