Алгоритм запутывания пятнашек

Алгоритм запутывания пятнашек

by LuckyCat

JavaScript

//алгоритм запутывания пятнашек
var f15 = {
	//случайный набор с 0 в конце
	order: [0,1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15].sort(function() {
		return Math.random()-.5;
	}),//.concat(0),
	// перестановка ячеек
	swap: function(i1, i2) {
		var t = this.order[i1];
		this.order[i1] = this.order[i2];
		this.order[i2] = t;
	},
	// проверка на решаемость
	solvable: function(a) {
		//для каждого элемента массива
		for (var kDisorder = 0, i = 1, len = a.length-1; i < len; i++){
			//узнаём сколько предшествующих элементов больше текущего
			for (var j = i-1; j >= 0; j--){
				//если один из предыдущих элементов больше - накручиваем счетчик
				if (a[j] > a[i]){
					kDisorder++;
				}
			}
		}

		//если сумма вышла четной - комбинация имеет решение
		return !(kDisorder % 2);
	}
};

// Если пазл нерешаемый, делаем его решаемым.
if (!f15.solvable(f15.order)){
	f15.swap(0, 1);
}

document.body.appendChild(document.createTextNode(f15.order));