Cómo anotar y sombrear una matriz

Cómo anotar y sombrear una matriz

Estoy intentando dibujar una matriz de programación dinámica. Mi intento hasta ahora es:

\documentclass[]{article}
\begin{document}
\begin{tabular}{c||c|ccccc|cccccccccc}
    &&1&1&1&1&1&0&0&0&0&0&0&0&0&0&0\\\hline\hline
    &0&1&2&3&4&5&6&7&8&9&10&11&12&13&14&15\\\hline
    0&1&1&2&3&4&5&5&6&7&8&9&10&11&12&13&14\\
    0&2&2&2&3&4&5&5&5&6&7&8&9&10&11&12&13\\
    0&3&3&3&3&4&5&5&5&5&6&7&8&9&10&11&12\\\hline
    1&4&3&3&3&3&4&5&6&6&6&7&8&9&10&11&12\\
    1&5&4&3&3&3&3&4&5&6&7&7&8&9&10&11&12\\
    1&6&5&4&3&3&3&4&5&6&7&8&8&9&10&11&12\\
    1&7&6&5&4&3&3&4&5&6&7&8&9&9&10&11&12\\
    1&8&7&6&5&4&3&4&5&6&7&8&9&10&10&11&12\\\hline
    0&9&8&7&6&5&4&3&4&5&6&7&8&9&10&10&11\\
    0&10&9&8&7&6&5&4&3&4&5&6&7&8&9&10&10\\
    0&11&10&9&8&7&6&5&4&3&4&5&6&7&8&9&10\\
    0&12&11&10&9&8&7&6&5&4&3&4&5&6&7&8&9\\
\end{tabular}
\end{document}

Ahora me gustaría añadir dos cosas:

  • Flechas entre los números para mostrar el camino más corto desde la parte superior izquierda hasta la parte inferior derecha.
  • Me gustaría sombrear algunos de los bloques en rojo (aquellos donde los símbolos son diferentes).

Intenté hacer esto en tikz (con una tabla diferente) pero no salió muy bien.

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\usepackage{pdflscape}
\begin{document}
    \tikzset{ 
        table/.style={
            matrix of nodes,
            row sep=-\pgflinewidth,
            column sep=-\pgflinewidth,
            nodes={rectangle,text width=1.5em,align=center},
            text depth=0.3125ex,
            text height=0.625ex,
            nodes in empty cells
        },
        row 1/.style={nodes={fill=green!10,text depth=0.4ex,text height=2ex}},
        row 6/.style={nodes={text depth=0.4ex,text height=2ex}},
        column 1/.style={nodes={fill=green!10}},
    }
    \begin{landscape}
        \begin{tikzpicture}
        %\begin{tabular}{c||c|cccccccccc|cccccc|ccccccccc}
        \matrix (mat) [table]{
            &&0&0&0&0&0&0&0&0&0&0&1&1&1&1&1&1&0&0&0&0&0&0&0&0&0\\
            &0&1&2&3&4&5&6&7&8&9&10&11&12&13&14&15&16&17&18&19&20&21&22&23&24&25\\
            1&1&|[fill=red!20]|1&|[fill=red!20]|2&|[fill=red!20]|3&|[fill=red!20]|4&|[fill=red!20]|5&|[fill=red!20]|6&|[fill=red!20]|7&|[fill=red!20]|8&|[fill=red!20]|9&|[fill=red!20]|10&10&11&12&13&14&15&|[fill=red!20]|16&|[fill=red!20]|17&|[fill=red!20]|18&|[fill=red!20]|19&|[fill=red!20]|20&|[fill=red!20]|21&|[fill=red!20]|22&|[fill=red!20]|23&|[fill=red!20]|24\\
            1&2&|[fill=red!20]|2&|[fill=red!20]|2&|[fill=red!20]|3&|[fill=red!20]|4&|[fill=red!20]|5&|[fill=red!20]|6&|[fill=red!20]|7&|[fill=red!20]|8&|[fill=red!20]|9&|[fill=red!20]|10&10&10&11&12&13&14&|[fill=red!20]|15&|[fill=red!20]|16&|[fill=red!20]|17&|[fill=red!20]|18&|[fill=red!20]|19&|[fill=red!20]|20&|[fill=red!20]|21&|[fill=red!20]|22&|[fill=red!20]|23\\
            1&3&|[fill=red!20]|3&|[fill=red!20]|3&|[fill=red!20]|3&|[fill=red!20]|4&|[fill=red!20]|5&|[fill=red!20]|6&|[fill=red!20]|7&|[fill=red!20]|8&|[fill=red!20]|9&|[fill=red!20]|10&10&10&10&11&12&13&|[fill=red!20]|14&|[fill=red!20]|15&|[fill=red!20]|16&|[fill=red!20]|17&|[fill=red!20]|18&|[fill=red!20]|19&|[fill=red!20]|20&|[fill=red!20]|21&|[fill=red!20]|22\\
            1&4&|[fill=red!20]|4&|[fill=red!20]|4&|[fill=red!20]|4&|[fill=red!20]|4&|[fill=red!20]|5&|[fill=red!20]|6&|[fill=red!20]|7&|[fill=red!20]|8&|[fill=red!20]|9&|[fill=red!20]|10&10&10&10&10&11&12&|[fill=red!20]|13&|[fill=red!20]|14&|[fill=red!20]|15&|[fill=red!20]|16&|[fill=red!20]|17&|[fill=red!20]|18&|[fill=red!20]|19&|[fill=red!20]|20&|[fill=red!20]|21\\
            0&5&4&4&4&4&4&5&6&7&8&9&|[fill=red!20]|10&|[fill=red!20]|11&|[fill=red!20]|11&|[fill=red!20]|11&|[fill=red!20]|11&|[fill=red!20]|12&12&13&14&15&16&17&18&19&20\\
            0&6&5&4&4&4&4&4&5&6&7&8&|[fill=red!20]|9&|[fill=red!20]|10&|[fill=red!20]|11&|[fill=red!20]|12&|[fill=red!20]|12&|[fill=red!20]|12&12&12&13&14&15&16&17&18&19\\
            0&7&6&5&4&4&4&4&4&5&6&7&|[fill=red!20]|8&|[fill=red!20]|9&|[fill=red!20]|10&|[fill=red!20]|11&|[fill=red!20]|12&|[fill=red!20]|13&12&12&12&13&14&15&16&17&18\\
            1&8&|[fill=red!20]|7&|[fill=red!20]|6&|[fill=red!20]|5&|[fill=red!20]|5&|[fill=red!20]|5&|[fill=red!20]|5&|[fill=red!20]|5&|[fill=red!20]|5&|[fill=red!20]|6&|[fill=red!20]|7&7&8&9&10&11&12&|[fill=red!20]|13&|[fill=red!20]|13&|[fill=red!20]|13&|[fill=red!20]|13&|[fill=red!20]|14&|[fill=red!20]|15&|[fill=red!20]|16&|[fill=red!20]|17&|[fill=red!20]|18\\
            %\end{tabular}
        };
        \foreach \x in {2,6,9}
        {
            \draw 
            ([xshift=-.125\pgflinewidth,yshift=3]mat-\x-1.south west) --   
            ([xshift=-.125\pgflinewidth,yshift=3]mat-\x-27.south east);
        }
    \begin{scope}[shorten >=7pt,shorten <= 7pt]
    \draw[->]  (mat-2-2.center) -- (mat-2-3.center);
    \draw[->]  (mat-2-3.center) -- (mat-2-4.center);
    \draw[->]  (mat-2-4.center) -- (mat-3-5.center);
    \draw[->]  (mat-3-5.center) -- (mat-4-6.center);
    \draw[->]  (mat-4-6.center) -- (mat-5-7.center);
    \draw[->]  (mat-5-7.center) -- (mat-6-8.center);
    \draw[->]  (mat-6-8.center) -- (mat-7-9.center);
    \draw[->]  (mat-7-9.center) -- (mat-8-10.center);
    \draw[->]  (mat-8-10.center) -- (mat-9-11.center);
    \draw[->]  (mat-9-11.center) -- (mat-10-12.center);

    \end{scope}

        \end{tikzpicture}
    \end{landscape}
\end{document}

Esto sufre algunos problemas.

  • Hay un espacio extraño entre dos de las líneas de la matriz.
  • El sombreado está desplazado para que no llene un bloque correctamente.
  • Las flechas no parecen estar todas alineadas correctamente.
  • La fuente de LaTeX es muy prolija.

Cualquier ayuda muy apreciada.

Respuesta1

Aquí vienen las correcciones:

  • quitando row 6estilo
  • eliminar text depthy configurar text heightpara 1.1exevitar cambios entre el relleno y el contenido de las celdas
  • sombree las áreas con un rectángulo de opacidad del 20% sobre la matriz en lugar de llenar cada celda.

    \documentclass{standalone}
    \usepackage{tikz}
    \usetikzlibrary{matrix}
    \begin{document}
    \tikzset{ 
        table/.style={
            matrix of nodes,
            row sep=-\pgflinewidth,
            column sep=-\pgflinewidth,
            nodes={rectangle,text width=1.5em,align=center},
            text height=1.1ex,
            nodes in empty cells,
        },
        row 1/.style={nodes={fill=green!10}},
        column 1/.style={nodes={fill=green!10}}
    }
    
    \begin{tikzpicture}
            \matrix (mat) [table]{
            &&0&0&0&0&0&0&0&0&0&0&1&1&1&1&1&1&0&0&0&0&0&0&0&0&0\\
            &0&1&2&3&4&5&6&7&8&9&10&11&12&13&14&15&16&17&18&19&20&21&22&23&24&25\\
            1&1&1&2&3&4&5&6&7&8&9&10&10&11&12&13&14&15&16&17&18&19&20&21&22&23&24\\
            1&2&2&2&3&4&5&6&7&8&9&10&10&10&11&12&13&14&15&16&17&18&19&20&21&22&23\\
            1&3&3&3&3&4&5&6&7&8&9&10&10&10&10&11&12&13&14&15&16&17&18&19&20&21&22\\
            1&4&4&4&4&4&5&6&7&8&9&10&10&10&10&10&11&12&13&14&15&16&17&18&19&20&21\\
            0&5&4&4&4&4&4&5&6&7&8&9&10&11&11&11&11&12&12&13&14&15&16&17&18&19&20\\
            0&6&5&4&4&4&4&4&5&6&7&8&9&10&11&12&12&12&12&12&13&14&15&16&17&18&19\\
            0&7&6&5&4&4&4&4&4&5&6&7&8&9&10&11&12&13&12&12&12&13&14&15&16&17&18\\
            1&8&7&6&5&5&5&5&5&5&6&7&7&8&9&10&11&12&13&13&13&13&14&15&16&17&18\\
        };
        \fill[red,opacity=0.2] (mat-3-3.north west) rectangle (mat-6-12.south east);
        \fill[red,opacity=0.2] (mat-7-13.north west) rectangle (mat-9-18.south east);
        \fill[red,opacity=0.2] (mat-3-19.north west) rectangle (mat-6-27.south east);
        \fill[red,opacity=0.2] (mat-10-3.north west) rectangle (mat-10-12.south east);
        \fill[red,opacity=0.2] (mat-10-19.north west) rectangle (mat-10-27.south east);
        \foreach \x in {2,6,9}
        {
            \draw 
            ([xshift=-.125\pgflinewidth]mat-\x-1.south west) --   
            ([xshift=-.125\pgflinewidth]mat-\x-27.south east);
        }
    \begin{scope}[shorten >=7pt,shorten <= 7pt]
    \draw[->]  (mat-2-2.center) -- (mat-2-3.center);
    \draw[->]  (mat-2-3.center) -- (mat-2-4.center);
    \draw[->]  (mat-2-4.center) -- (mat-3-5.center);
    \draw[->]  (mat-3-5.center) -- (mat-4-6.center);
    \draw[->]  (mat-4-6.center) -- (mat-5-7.center);
    \draw[->]  (mat-5-7.center) -- (mat-6-8.center);
    \draw[->]  (mat-6-8.center) -- (mat-7-9.center);
    \draw[->]  (mat-7-9.center) -- (mat-8-10.center);
    \draw[->]  (mat-8-10.center) -- (mat-9-11.center);
    \draw[->]  (mat-9-11.center) -- (mat-10-12.center);
    
    \end{scope}
    
        \end{tikzpicture}
    \end{document}
    

ingrese la descripción de la imagen aquí

Editar

Colorear bloques de una matriz rellenando un rectángulo opaco al 20% encima fue una solución que no me satisfizo. Quería bloquear y asignar estilos a la celda, pero tikz no tiene opciones para eso. Después de trabajar a partir de las respuestas aesta pregunta, logré hacerlo: la filinredopción define estilos para un bloque de celdas a través de 2 bucles (definidos con /.list), y luego la lista de bloques se define al principio de la matriz con formato (arriba, de izquierda a abajo, derecha):

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
    \tikzset{ 
        table/.style={
            matrix of nodes,
            row sep=-\pgflinewidth,
            column sep=-\pgflinewidth,
            nodes={rectangle,text width=1.5em,align=center},
            text height=1.1ex,
            nodes in empty cells,
        },
        row 1/.style={nodes={fill=green!10}},
        column 1/.style={nodes={fill=green!10}},
        fillinred/.style args = {(#1,#2 to #3,#4)}{
            blockrows/.style={
                block/.style={
                    row ##1 column ####1/.style={nodes={fill=red!20}}
                },
                block/.list={#2,...,#4}
            },
            blockrows/.list={#1,...,#3}
        } 
    }

        \begin{tikzpicture}
            \matrix (mat) [table,fillinred/.list={(3,3 to 6,12),(10,3 to 10,12),(7,13 to 9,18),(3,19 to 6,27),(10,19 to 10,27)}]{
            &&0&0&0&0&0&0&0&0&0&0&1&1&1&1&1&1&0&0&0&0&0&0&0&0&0\\
            &0&1&2&3&4&5&6&7&8&9&10&11&12&13&14&15&16&17&18&19&20&21&22&23&24&25\\
            1&1&1&2&3&4&5&6&7&8&9&10&10&11&12&13&14&15&16&17&18&19&20&21&22&23&24\\
            1&2&2&2&3&4&5&6&7&8&9&10&10&10&11&12&13&14&15&16&17&18&19&20&21&22&23\\
            1&3&3&3&3&4&5&6&7&8&9&10&10&10&10&11&12&13&14&15&16&17&18&19&20&21&22\\
            1&4&4&4&4&4&5&6&7&8&9&10&10&10&10&10&11&12&13&14&15&16&17&18&19&20&21\\
            0&5&4&4&4&4&4&5&6&7&8&9&10&11&11&11&11&12&12&13&14&15&16&17&18&19&20\\
            0&6&5&4&4&4&4&4&5&6&7&8&9&10&11&12&12&12&12&12&13&14&15&16&17&18&19\\
            0&7&6&5&4&4&4&4&4&5&6&7&8&9&10&11&12&13&12&12&12&13&14&15&16&17&18\\
            1&8&7&6&5&5&5&5&5&5&6&7&7&8&9&10&11&12&13&13&13&13&14&15&16&17&18\\
        };
        \foreach \x in {2,6,9}
        {
            \draw 
            ([xshift=-.125\pgflinewidth]mat-\x-1.south west) --   
            ([xshift=-.125\pgflinewidth]mat-\x-27.south east);
        }
        \begin{scope}[shorten >=7pt,shorten <= 7pt]
            \draw[->]  (mat-2-2.center) -- (mat-2-3.center);
            \draw[->]  (mat-2-3.center) -- (mat-2-4.center);
            \draw[->]  (mat-2-4.center) -- (mat-3-5.center);
            \draw[->]  (mat-3-5.center) -- (mat-4-6.center);
            \draw[->]  (mat-4-6.center) -- (mat-5-7.center);
            \draw[->]  (mat-5-7.center) -- (mat-6-8.center);
            \draw[->]  (mat-6-8.center) -- (mat-7-9.center);
            \draw[->]  (mat-7-9.center) -- (mat-8-10.center);
            \draw[->]  (mat-8-10.center) -- (mat-9-11.center);
            \draw[->]  (mat-9-11.center) -- (mat-10-12.center);
        \end{scope}

    \end{tikzpicture}
\end{document}

información relacionada