Back to Code

Balanced Latin squares

A latin square is an N x N matrix in which every row and column contains exactly one of each of N elements. If the square is balanced, every element is followed and preceded exactly once by each other element.

The following Matlab script generates random balanced latin squares.

function L = latin(N)

while 1 == 1,
    L = zeros(N, N);
    L(1, 1:N) = randperm(N);
    
    for i = 1:N,
        for j = 1:N,
            if L(i, j) ~= 0,
                continue;
            end;
            allowed = 1:N;
            for test = 1:N,
                if ~isempty(find(L(i, :) == allowed(test))),
                    allowed(test) = 0;
                    continue;
                elseif ~isempty(find(L(:, j) == allowed(test))),
                    allowed(test) = 0;
                    continue;
                else,
                    for k = 1:i,
                        el = find(L(k, :) == allowed(test));
                        if el > 1 & j > 1,
                            if L(i, j - 1) == L(k, el - 1),
                                allowed(test) = 0;
                            end;
                        end;
                    end;
                end;
            end;
            allowed(find(allowed == 0)) = [];
            if ~isempty(allowed),
                L(i, j) = allowed(1);
            end;
        end;
    end;
    if isempty(find(L == 0)),
        break;
    end;
end