function kakuro = kakuro_example(num)
%
% kakuro = kakuro_example(num)
% 
% Dieses Matlab-Programm liefert Beispiele fuer Kakuros, wobei die Ausgabe
% in einer Struktur erfolgt:
%
%  kakuro.hm - Matrix fuer horizontale Summen
%              Felder, die zu einer Summe gehoeren, sind durch gleiche
%              positive ganze Zahlen markiert. Die Zahl Null markiert
%              Felder wo keine Zahlen zu setzen sind.
%  kakuro.hv - Vektor fuer horizontale Summen
%              Die ganze Zahl aus der Matrix bildet den Index in diesen
%              Vektor der Summen.
%  kakuro.vm - Matrix  fuer vertikale Summen
%              Felder, die zu einer Summe gehoeren, sind durch gleiche
%              positive ganze Zahlen markiert. Die Zahl Null markiert
%              Felder wo keine Zahlen zu setzen sind.
%  kakuro.vv - Vektor fuer vertikale Summen
%              Die ganze Zahl aus der Matrix bildet den Index in diesen
%              Vektor der Summen.
%
% Lautet also die erste Zeile von kakuro.hm
%
%     0 0 1 1 0 2 2 0 0
%
% und die ersten beiden Zahlen in kakuro.hv
%
%     16 6
%
% koente die z.B. Loesung so aussehen:
%
%     0 0 9 7 0 5 1 0 0
%
% Die Definition (siehe unten) kann in dieser Form erfolgen, bzw. kann die
% Definition (case 3) auch in Form einer dreidimensionalen Matrix erfolgen.
% Fuer ein (m x n)-Kakuro wird dabei eine (m x n x 2)-Matrix spezifiziert.
% Die erste Seite (kakuro(:,:,1)) representiert die Horizontalsummen und die
% zweite Seite (kakuro(:,:,2)) representiert die Vertikalsummen. Am Beginn
% (links bzw. oben) steht die notwendige Summe, gefolgt von Nullen. Dies
% wird beendet durch NaN oder durch den rechten bzw. unteren Rand der
% Matrix. Am Beispiel
%
%    14 0 0 0 n 8 0 0
%
% muesste die Zahl 14 als Summe der ersten vier Felder erreicht werden und
% die Zahl 8 als Summe der letzten drei Felder, also z.B. durch
%
%     5 4 3 2 n 3 4 1
%
% Eine normale Darstellung eines Kakuros kann man sich z.B.
%
%     K = kakuro_example(1);
%     kakuro_show(K);
%
% ansehen.
%
% Winfried Kernbichler 13.05.2007

if nargin < 1, num = 1; end

n = nan;

switch num
    case 1
        kakuro.hm = [ ...
             0, 0, 1, 1, 0, 2, 2, 0, 0; ...
             0, 3, 3, 3, 0, 4, 4, 4, 0; ...
             5, 5, 0, 6, 6, 0, 0, 7, 7; ...
             8, 8, 8, 0, 9, 9, 9, 9, 9; ...
             0, 0,10,10, 0,11,11, 0, 0; ...
            12,12,12,12,12, 0,13,13,13; ...
            14,14, 0, 0,15,15, 0,16,16; ...
             0,17,17,17, 0,18,18,18, 0; ...
             0, 0,19,19, 0,20,20, 0, 0  ];
         kakuro.hv = [ ...
            16, 6,18,20,11, ...
             3, 4,12,33, 9, ...
            11,33, 6, 9,17, ...
            16, 8,22, 5, 7  ];
         kakuro.vm = [ ...
             0, 0, 5, 8, 0,13,16, 0, 0; ...
             0, 3, 5, 8, 0,13,16,19, 0; ...
             1, 3, 0, 8,11, 0, 0,19,21; ...
             1, 3, 6, 0,11,14,17,19,21; ...
             0, 0, 6, 9, 0,14,17, 0, 0; ...
             2, 4, 6, 9,12, 0,17,20,22; ...
             2, 4, 0, 0,12,15, 0,20,22; ...
             0, 4, 7,10, 0,15,18,20, 0; ...
             0, 0, 7,10, 0,15,18, 0, 0  ];
         kakuro.vv = [ ...
            16, 4,12,17, 9, ...
            21, 4,17, 7, 7, ...
             5,17, 9, 8,14, ...
            14,17,15,12,20, ...
            12, 9           ];
    case 2
        kakuro.hm = [ ...
             1, 1, 0, 2, 2, 0, 3, 3, 0; ...
             4, 4, 4, 4, 4, 4, 4, 4, 4; ...
             0, 5, 5, 0, 6, 6, 0, 7, 7; ...
             8, 8, 8, 8, 0, 0, 9, 9, 0; ...
            10,10,10,10, 0,11,11,11,11; ...
             0,12,12, 0, 0,13,13,13,13; ...
            14,14, 0,15,15, 0,16,16, 0; ...
            17,17,17,17,17,17,17,17,17; ...
             0,18,18, 0,19,19, 0,20,20  ];
         kakuro.hv = [ ...
            16, 3, 5,45,16, ...
             3, 6,29, 5,10, ...
            28, 9,20,13, 6, ...
             7,45, 3,10,10  ];
         kakuro.vm = [ ...
             1, 4, 0, 7,10, 0,15,17, 0; ...
             1, 4, 5, 7,10,12,15,17,18; ...
             0, 4, 5, 0,10,12, 0,17,18; ...
             2, 4, 5, 8, 0, 0,16,17, 0; ...
             2, 4, 5, 8, 0,13,16,17,19; ...
             0, 4, 5, 0, 0,13,16,17,19; ...
             3, 4, 0, 9,11, 0,16,17, 0; ...
             3, 4, 6, 9,11,14,16,17,20; ...
             0, 4, 6, 0,11,14, 0,17,20  ];
         kakuro.vv = [ ...
            14, 8,14,45,18, ...
             4, 5,12, 5,10, ...
            10,10, 8,12,12, ...
            17,45, 7,17,16  ];
        
    case 3
        kakuro = zeros(11,9,2);
        % horizontal
        kakuro(:,:,1) = [ ...
           14     0     n    20     0     0     n    16     0 ; ...
            8     0     n     7     0     0     n     7     0 ; ...
            n    22     0     0     n     6     0     0     n ; ...
           11     0     0     0     n    12     0     0     0 ; ...
           13     0     n    23     0     0     n    11     0 ; ...
            n     n    16     0     0     0     0     n     n ; ...
           26     0     0     0     n    27     0     0     0 ; ...
            6     0     0     n     n     n     7     0     0 ; ...
            n    41     0     0     0     0     0     0     n ; ...
            6     0     n    19     0     0     n    12     0 ; ...
           16     0     n     9     0     0     n     3     0   ...
            ];
        % vertical
        kakuro(:,:,2) = [ ...
           14    23     n    28    10    41     n    30     8 ; ...
            0     0     n     0     0     0     n     0     0 ; ...
            n     0    13     0     n     0     3     0     n ; ...
           12     0     0     0     n     0     0     0     4 ; ...
            0     0     n     0    10     0     n     0     0 ; ...
            n     n    16     0     0     0    11     n     n ; ...
            3    31     0     0     n     0     0    20    13 ; ...
            0     0     0     n     n     n     0     0     0 ; ...
            n     0     0     8    17    23     0     0     n ; ...
           10     0     n     0     0     0     n     0    10 ; ...
            0     0     n     0     0     0     n     0     0   ...
            ];

    case 4
        error(['Case ',int2str(n),' not defined!'])
        % only placekeeper
        kakuro = zeros(11,9,2);
        % horizontal
        kakuro(:,:,1) = [ ...
            0     0     0     0     0     0     0     0     0 ; ...
            0     0     0     0     0     0     0     0     0 ; ...
            0     0     0     0     0     0     0     0     0 ; ...
            0     0     0     0     0     0     0     0     0 ; ...
            0     0     0     0     0     0     0     0     0 ; ...
            0     0     0     0     0     0     0     0     0 ; ...
            0     0     0     0     0     0     0     0     0 ; ...
            0     0     0     0     0     0     0     0     0 ; ...
            0     0     0     0     0     0     0     0     0 ; ...
            0     0     0     0     0     0     0     0     0 ; ...
            0     0     0     0     0     0     0     0     0   ...
            ];
        % vertical
        kakuro(:,:,2) = [ ...
            0     0     0     0     0     0     0     0     0 ; ...
            0     0     0     0     0     0     0     0     0 ; ...
            0     0     0     0     0     0     0     0     0 ; ...
            0     0     0     0     0     0     0     0     0 ; ...
            0     0     0     0     0     0     0     0     0 ; ...
            0     0     0     0     0     0     0     0     0 ; ...
            0     0     0     0     0     0     0     0     0 ; ...
            0     0     0     0     0     0     0     0     0 ; ...
            0     0     0     0     0     0     0     0     0 ; ...
            0     0     0     0     0     0     0     0     0 ; ...
            0     0     0     0     0     0     0     0     0   ...
            ];        
        
    otherwise
        error(['Case ',int2str(n),' not defined!'])
end

if ~isstruct(kakuro)
    kakuro = kakuro_convert(kakuro);
end

