Вот то, что я придумала с головы до головы - я не потрудился на оптимизации, потому что для размера сетки 5х5, упомянутого в вопросе, это чувствуется мгновенно.(Тестирование в IE7 даже на сетках 7x7 занимает всего пару секунд. 8x8 заметно медленнее, иногда достаточно медленное, чтобы вызвать длительную ошибку сценария.)
function createGrid(size) {
var grid = [],
row = [],
x,y,t;
for (x=size; x>0; x--)
row.push(x);
addRows:
while (grid.length < size) {
t = row.slice();
row = [];
while (t.length > 0)
row.push(t.splice(Math.floor(Math.random() * t.length), 1)[0]);
for (y=0; y<grid.length; y++)
for (x=0; x<size; x++)
if (row[x] === grid[y][x])
continue addRows;
grid.push(row);
}
return grid;
}
var test = createGrid(5);
alert(test.join("\n"));
В случае, если это не очевидно, основная идеяначинать со строки [5,4,3,2,1];перемешайте строку и проверьте, можно ли ее добавить;повторяйте, пока не закончите.
(Я думал о том, чтобы начать с генерации всех потенциальных строк и затем случайного выбора из них, но это казалось слишком сложным, учитывая, что я не очень хорош с алгоритмами перестановки - просто делаю случайныетасовать каждый раз казалось гораздо меньше проблем.)