0

我为这样的文件制作了一个解析器:

intrepideg
xtdcvmhgze
yrwhoejkpn
minusculet
isnqdhivpi
ntznyafhel
ceamgnqgug
erpoxtavrf
gwaupsgwsd
kyqtendrme

这个想法是从用户那里接收一个字符串,然后在水平、垂直和对角线上搜索它。我在对角线的方式上苦苦挣扎,因为我寻找使迭代次数更少的最佳方式。我应该从双数组的每个角落开始做 4 次通道,找到双数组的中间,然后从开始到开始做 2 次通道吗?什么是最好的算法?

这是我的程序的核心功能:

t_inco          search_all(t_inco inco)
{
  int           i;
  int           f;
  int           j;

  i = 0;
  f = 0;
  j = 0;
  while (inco.map[i])
    {
      while(inco.map[i][f])
        {
          if (inco.map[i][f] == inco.wd[0])
            {
              if(find_cases_h(inco, i, f))
                {
                  inco = get_cases(inco, i, f, 1);
                  return(inco);
                }
              else if(find_cases_v(inco, i, f))
                {
                  inco = get_cases(inco, i, f, 2);
                  return(inco);
                }
              else if(find_cases_d(inco, i, f))
                {
                  inco = get_cases(inco, i, f, 3);
                  return(inco);
                }
            }
          f++;
        }
      i++;
      f = 0;
    }
  return(inco);
}
4

2 回答 2

3

我建议你进行 4 次传球,每一次都从不同的角落开始。例如,给定您的数组:

intrepideg
xtdcvmhgze
yrwhoejkpn
minusculet
isnqdhivpi
ntznyafhel
ceamgnqgug
erpoxtavrf
gwaupsgwsd
kyqtendrme

从左上角开始,您将在对角线上从右到左向下搜索。所以:“i”、“nx”、“tty”、“rdrm”等。在右上角,搜索“g”、“ee”、“dzn”等:从左下移到的对角线正确的。

尽管通过数组的次数更多,但它比尝试在一次扫描数组中搜索所有四个对角线更简单。

您可以分两遍完成。毕竟,对角线从右到左向下移动的搜索只是对角线从左到右向上移动的反转。所以你可以设置你的迭代来搜索“i”、“nx”、“xn”、“tty”、“ytt”、“rdrm”、“mrdr”等。速度上的差异不会但是,它会很多,这会使您的算法复杂化。

于 2013-07-23T13:29:52.653 回答
0

我很想把它想象成一场突围游戏。让一个“球”在阵列内沿对角线“弹跳”。使数组的大小使球能够反弹并击中每个字母。我猜这可能不是一个非常理想的方法,并且不确定球是否有可能击中每个字母(重新角),但这可能是一种有趣的方法来测试好奇:-)

于 2013-07-23T15:22:45.370 回答