我正在尝试绘制动态规划矩阵。到目前为止,我的尝试是:
\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}
现在我想补充两点:
- 数字之间的箭头显示从左上角到右下角的最短路径。
- 我想用红色标记一些块(那些符号不同的块)。
我尝试在 tikz 中执行此操作(使用不同的表格),但效果不太好。
\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}
这存在一些问题。
- 矩阵中的两条线之间有一个奇怪的空格。
- 阴影发生了偏移,因此无法正确填充块。
- 箭头似乎没有全部正确排列。
- LaTeX 源代码非常冗长。
任何帮助都非常感谢。
答案1
以下是一些更正:
- 移除
row 6
样式 - 移除
text depth
并设置text height
为,1.1ex
以避免填充和单元格内容之间的偏移 使用矩阵上方 20% 不透明度的矩形来遮蔽区域,而不是填充每个单元格。
\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}
编辑
通过填充 20% 不透明矩形来为矩阵块着色是一种让我不满意的解决方案。我想将样式块分配给单元格,但 tikz 没有这样的选项。在从以下答案开始工作后这个问题,我设法做到了:filinred
选项通过2个循环(用 定义)定义单元格块的样式/.list
,然后在矩阵的开头以格式(从上到下、从左到右)定义块列表:
\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}