解析对角双阵列

时间:2013-07-23 13:09:16

标签: c algorithm parsing

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

intrepideg
xtdcvmhgze
yrwhoejkpn
minusculet
isnqdhivpi
ntznyafhel
ceamgnqgug
erpoxtavrf
gwaupsgwsd
kyqtendrme

这个想法是从用户接收一个字符串,然后搜索水平,垂直和对角线。 我用对角线方式挣扎,因为我搜索最佳方式来减少迭代次数。 我应该在双阵列的每个角落开始4通道,找到双阵列的中间然后从2开始通过?什么是最好的algorythm?

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

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);
}

2 个答案:

答案 0 :(得分:3)

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

intrepideg
xtdcvmhgze
yrwhoejkpn
minusculet
isnqdhivpi
ntznyafhel
ceamgnqgug
erpoxtavrf
gwaupsgwsd
kyqtendrme

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

虽然通过数组传递的次数更多,但它比在单次扫描数组中搜索所有四个对角线要简单得多。

你可以在两次传球中完成。毕竟,从右到左向下移动的对角线的搜索只是从左到右向上移动的对角线的反转。所以你可以设置第一遍的迭代来搜索“i”,“nx”,“xn”,“tty”,“ytt”,“rdrm”,“mrdr”等。速度的差异不会尽管如此,它会使你的算法变得复杂。

答案 1 :(得分:0)

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