Last active
December 19, 2015 18:48
-
-
Save kentan/6001171 to your computer and use it in GitHub Desktop.
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
package demo | |
fun main(args : Array<String>) { | |
val data = array(1,2,3,0,5,6,7,4,9,10,11,8,13,14,15,12); | |
var limit:Int = 0; | |
var LIMIT_MAX:Int = 20; | |
while(limit <= LIMIT_MAX){ | |
print(limit); | |
if(run(data,0,-1,limit)){ | |
break; | |
} | |
limit += 1; | |
} | |
} | |
fun search_white_space_pos(data : Array<Int>):Int{ | |
for(i in data.indices){ | |
if(data[i] == 0){ | |
return i; | |
} | |
} | |
return -1; | |
} | |
fun finish(data : Array<Int>):Boolean{ | |
for(i:Int in data.indices){ | |
if(i == 15){ | |
if(data[i] == 0){ | |
return true; | |
}else{ | |
return false; | |
} | |
}else{ | |
if(data[i] == i + 1){ | |
continue; | |
} | |
return false; | |
} | |
} | |
return true; | |
} | |
fun is_move_down(white_space_pos:Int):Boolean{ | |
if(white_space_pos >= 12 && white_space_pos <= 15){ | |
return false; | |
} | |
return true; | |
} | |
fun is_move_up(white_space_pos:Int):Boolean{ | |
if(white_space_pos >= 0 && white_space_pos <= 3){ | |
return false; | |
} | |
return true; | |
} | |
fun is_move_left(white_space_pos:Int):Boolean{ | |
if(white_space_pos == 0 || white_space_pos == 4 || white_space_pos == 8 || white_space_pos == 12){ | |
return false; | |
} | |
return true; | |
} | |
fun is_move_right(white_space_pos:Int):Boolean{ | |
if(white_space_pos == 3 || white_space_pos == 7 || white_space_pos == 9 || white_space_pos == 15){ | |
return false; | |
} | |
return true; | |
} | |
fun swap(data:Array<Int>,pos1:Int,pos2:Int){ | |
var temp:Int = data[pos2]; | |
data[pos2] = data[pos1]; | |
data[pos1] = temp; | |
} | |
fun show(data:Array<Int>){ | |
for(d in data){ | |
print(d); | |
print(" "); | |
} | |
println(); | |
} | |
fun run(data : Array<Int>,depth:Int,previous:Int,limit:Int):Boolean{ | |
var white_space_pos:Int = search_white_space_pos(data); | |
if(depth > limit){ | |
return false; | |
} | |
if(finish(data)){ | |
println("found"); | |
show(data); | |
return true; | |
} | |
if(previous != 1 && is_move_down(white_space_pos)){ | |
swap(data,white_space_pos,white_space_pos + 4); | |
if(run(data,depth + 1,0,limit)){ | |
return true; | |
} | |
swap(data,white_space_pos + 4,white_space_pos); | |
} | |
if(previous != 0 && is_move_up(white_space_pos)){ | |
swap(data,white_space_pos,white_space_pos - 4); | |
if(run(data,depth + 1,1,limit)){ | |
return false; | |
} | |
swap(data,white_space_pos - 4,white_space_pos); | |
} | |
if(previous != 3 && is_move_left(white_space_pos)){ | |
swap(data,white_space_pos,white_space_pos - 1); | |
if(run(data,depth + 1,2,limit)){ | |
return false; | |
} | |
swap(data,white_space_pos - 1,white_space_pos); | |
} | |
if(previous != 2 && is_move_right(white_space_pos)){ | |
swap(data,white_space_pos,white_space_pos + 1); | |
if(run(data,depth + 1,3,limit)){ | |
return false; | |
} | |
swap(data,white_space_pos + 1,white_space_pos); | |
} | |
return false; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment