동적 프로그래밍 행렬을 그리려고 합니다. 지금까지 내 시도는 다음과 같습니다
\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}