Skip to content

Instantly share code, notes, and snippets.

@kentan
Last active December 19, 2015 18:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kentan/6001171 to your computer and use it in GitHub Desktop.
Save kentan/6001171 to your computer and use it in GitHub Desktop.
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