Created
November 15, 2017 09:43
-
-
Save SohanChy/f4c668d4cb07da90b899c92df0f43524 to your computer and use it in GitHub Desktop.
N Puzzle Solvability
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Line 105:
Replace
To