如何渲染 Futoshiki 拼图?

如何渲染 Futoshiki 拼图?

我想要一个太式文档中的谜题。这是一个类似于数独的游戏,但增加了一些信息,即一些相邻单元格之间有符号,表示哪个单元格应该包含更大的数字。

Futoshiki 拼图是一个简单的方格网格,里面有几个数字(拼图完成后,所有单元格都包含一个数字)。复杂之处在于,一些相邻单元格之间有“>”符号,用于指定两个数字中哪个更大。这些符号可以出现在水平或垂直相邻的两个单元格之间。传统上,单元格彼此分开绘制,单元格之间有空白(空白处),“>”符号就绘制在那里。以下是来自上述来源/链接的 5x5 拼图示例(不幸的是,它没有任何垂直不等号。它们也是需要的):

在此处输入图片描述

...及其附带的解决方案:

在此处输入图片描述

实现可以是任何实际的东西。我首先想到了一个tabular环境,但不知道如何设置排水沟并在其中书写。

答案1

您可以使用该tikz-cd包,它还会生成一个节点矩阵(如Jasper Habicht 的回答),但允许您定义由字形组成的箭头。因此,可以通过箭头创建更大的符号,您可以在图表内部设置箭头,例如,\arrow[r]表示当前单元格大于其右侧的单元格。为了让您信服,箭头命令存储在\mygreater宏中。

\documentclass{article}
\usepackage{amsmath} 
\usepackage{tikz-cd} 
\tikzcdset{Futoshiki/.style={nodes in empty cells,
    row sep=1.2em,column sep=1.2em,
    every arrow/.append style={-greater,shorten >=0.3em,shorten <=0.3em},
    cells={nodes={draw,minimum size=2.4em,text depth=0.4em,
    text height=1.2em,
    anchor=center}}},
    greater/.tip={Glyph[glyph math command=mygreater, glyph length=1.5ex]}}
\newcommand{\mygreater}{>}
\begin{document}

\begin{tikzcd}[Futoshiki]
  \arrow[r]    & \arrow[r]  & \arrow[r]    & \arrow[r]  &              \\
  \boldsymbol4 &            &              &            & \boldsymbol2 \\
               &            & \boldsymbol4 &            &              \\
               &            &              &            & \boldsymbol4 \\
               &            &              &            &               
\end{tikzcd}               
\end{document}

在此处输入图片描述

答案2

你可以利用 Ti节点的 Z 矩阵:

\documentclass[border=1mm, tikz]{standalone}

\usetikzlibrary{matrix, calc}

\begin{document}

\begin{tikzpicture}
  \matrix (m) [matrix of nodes, nodes in empty cells,
    row sep=1em, column sep=1em,
    nodes={draw, minimum width=2em, minimum height=2em, inner sep=0pt, anchor=center}] {
               &            &            &            &            \\
    \textbf{4} &            &            &            & \textbf{2} \\
               &            & \textbf{4} &            &            \\
               &            &            &            & \textbf{4} \\
               &            &            &            &            \\
  };
  \foreach \x/\y in {1-1/1-2, 1-3/1-4, 1-4/1-5} {
    \node at ($(m-\x)!0.5!(m-\y)$) {$>$};
  }
  \foreach \x/\y in {4-5/4-4, 5-3/5-2, 5-2/5-1} {
    \node at ($(m-\x)!0.5!(m-\y)$) {$<$};
  }
\end{tikzpicture}

\begin{tikzpicture}
  \matrix (m) [matrix of nodes, nodes in empty cells,
    row sep=1em, column sep=1em,
    nodes={draw, minimum width=2em, minimum height=2em, inner sep=0pt, anchor=center}] {
    5          & 4          & 3          & 2         & 1          \\
    \textbf{4} & 3          & 1          & 5         & \textbf{2} \\
    2          & 1          & \textbf{4} & 3         & 5          \\
    3          & 5          & 2          & 1         & \textbf{4} \\
    1          & 2          & 5          & 4         & 3          \\
  };
  \foreach \x/\y in {1-1/1-2, 1-3/1-4, 1-4/1-5} {
    \node at ($(m-\x)!0.5!(m-\y)$) {$>$};
  }
  \foreach \x/\y in {4-5/4-4, 5-3/5-2, 5-2/5-1} {
    \node at ($(m-\x)!0.5!(m-\y)$) {$<$};
  }
\end{tikzpicture}

\end{document}

在此处输入图片描述

在此处输入图片描述

如果垂直对齐<并且>需要符号,则只需将节点旋转 90 度: \node[rotate=90] at ($(m-1-1)!0.5!(m-2-1)$) {$>$};

答案3

您可以在此处使用图片模式,不需要任何软件包。

在此处输入图片描述

\documentclass{article}

\begin{document}

\fbox{\large\begin{picture}(180,180)





% row 1
\put(00,160){\framebox(20,20){5}}
   \put(30,160){\makebox(0,20){\boldmath$>$}}
\put(40,160){\framebox(20,20){4}}
   \put(70,160){\makebox(0,20){\boldmath$ $}}
\put(80,160){\framebox(20,20){3}}
   \put(110,160){\makebox(0,20){\boldmath$>$}}
\put(120,160){\framebox(20,20){2}}
   \put(150,160){\makebox(0,20){\boldmath$>$}}
\put(160,160){\framebox(20,20){1}}



% row 2
\put(00,120){\framebox(20,20){4}}
   \put(30,120){\makebox(0,20){\boldmath$ $}}
\put(40,120){\framebox(20,20){3}}
   \put(70,120){\makebox(0,20){\boldmath$ $}}
\put(80,120){\framebox(20,20){1}}
   \put(110,120){\makebox(0,20){\boldmath$ $}}
\put(120,120){\framebox(20,20){5}}
   \put(150,120){\makebox(0,20){\boldmath$ $}}
\put(160,120){\framebox(20,20){2}}

% row 3
\put(00,80){\framebox(20,20){2}}
   \put(30,80){\makebox(0,20){\boldmath$ $}}
\put(40,80){\framebox(20,20){1}}
   \put(70,80){\makebox(0,20){\boldmath$ $}}
\put(80,80){\framebox(20,20){4}}
   \put(120,80){\makebox(0,20){\boldmath$ $}}
\put(120,80){\framebox(20,20){3}}
   \put(150,80){\makebox(0,20){\boldmath$ $}}
\put(160,80){\framebox(20,20){5}}


% row 4
\put(00,40){\framebox(20,20){3}}
   \put(30,40){\makebox(0,20){\boldmath$ $}}
\put(40,40){\framebox(20,20){5}}
   \put(70,40){\makebox(0,20){\boldmath$ $}}
\put(80,40){\framebox(20,20){2}}
   \put(110,40){\makebox(0,20){\boldmath$ $}}
\put(120,40){\framebox(20,20){1}}
   \put(150,40){\makebox(0,20){\boldmath$<$}}
\put(160,40){\framebox(20,20){4}}

% between row 4 and 5
\put(80,20){\makebox(20,20){\boldmath$<$}}

% row 5
\put(00,0){\framebox(20,20){1}}
   \put(30,0){\makebox(0,20){\boldmath$<$}}
\put(40,0){\framebox(20,20){2}}
   \put(70,0){\makebox(0,20){\boldmath$<$}}
\put(80,0){\framebox(20,20){5}}
   \put(110,0){\makebox(0,20){\boldmath$ $}}
\put(120,0){\framebox(20,20){4}}
   \put(150,0){\makebox(0,20){\boldmath$ $}}
\put(160,0){\framebox(20,20){3}}
\end{picture}}
\end{document}

答案4

这是一个可行的(简单)想法,仅使用带有粗体字符fancyvrb选项的包。{Verbatim}[commandchars=\\\{\}]

\documentclass[12pt]{article}
\usepackage{fancyvrb}

\begin{document}
\begin{Verbatim}[commandchars=\\\{\}]
    |. | 2 | . | . | .|
    |- - - - v - - - -| 
    |. > . | . | . | .|
    |- - - - - - - - -| 
    |. | . < \textbf{4} | . | .|
    |- - - - v - - - -| 
    |. | . | . | . | .|
    |^ - - - > - - - -| 
    |. | . | 5 | . | .|
\end{Verbatim}
\end{document}

在此处输入图片描述

相关内容