在两列中查找匹配并替换

时间:2016-02-19 18:55:37

标签: c logic

我有两列,其中每个字段都有一个int,如下所示:

  

1 2
  2 3
  4 1
  5 6

我也有一个更大的网格,如:

  

1 1 1 1 2 2 1
  1 2 3 4 2 1 1
  1 3 2 3 1 3 2
  1 3 6 5 6 1 3

两列让我知道我必须将每2个替换为1,每3个替换2个,每1个替换4个更大的网格,因此结果可以是

  

1 1 1 1 1 1 1   1 1 1 1 1 1 1
  1 1 1 1 1 1 1
  1 1 5 5 5 1 1

如果我继续用第一个条目直接替换第二个表,我将无法继续第二个,因为没有更多的“2”。

我该如何解决?

如果问题不是那么清楚,我会给你这篇解释问题的文章,但没有提出任何具体的解决方案。

http://www.labbookpages.co.uk/software/imgProc/blobDetection.html#table

编辑:我有这样的输入:

交换表

  

3 2
  4 1

要更正的表

1111111111111111111111111111
1122111111111111111111113311
1122211111111111111111133311
1112221111111111111111333111
1111222111111111111113331111
1111122211111111111133311111
1111112221111111111333111111
1111111222111111113331111111
1111111122211111133311111111
1111111111222113331111111111
1111111111122222211111111111
1111111111112222111111111111
1111111111112222111111111111
1111111111122222211111111111
1111111111222442221111111111
1111111112224444222111111111
1111111122244444422211111111
1111111222444444442221111111
1111112224444444444222111111
1111122244444444444422211111
1111222444444444444442221111
1112224444444444444444222111
1122244444444444444444422211
1122444444444444444444442211
1111111111111111111111111111

(这是一个X)

在这种情况下很容易进行替换,因为除了3和1之外我没有另外的2引用,但大多数情况都是如此。 我所做的就是直接将3和2替换为3,将1替换为4。

3 个答案:

答案 0 :(得分:1)

如您所知,您无法将变换一个接一个地应用到整个网格中。相反,您应该为每个网格单元找到正确的转换。

根据输入分配唯一值的规则称为地图。身份地图只是将每个值映射到自身;这些是你不会改变的元素。从身份地图开始,然后根据您的替换对进行调整。

这是一个基于你的第一个例子的简单程序。确保每个输入值都是map数组中的有效索引。

#include <stdlib.h>
#include <stdio.h>

int main()
{
    int grid[4][7] = {
        {1, 1, 1, 1, 2, 2, 1},
        {1, 2, 3, 4, 2, 1, 1},
        {1, 3, 2, 3, 1, 3, 2},
        {1, 3, 6, 5, 6, 1, 3},
    };
    int map[10] = {
        0, 1, 2, 3, 4, 5, 6, 7, 8, 9       // identity
    };
    int i, j;

    map[2] = 1;                            // adjust map to
    map[3] = 2;                            // replacement pairs
    map[1] = 4;
    map[6] = 5;

    // apply mapping rule
    for (j = 0; j < 4; j++) {
        for (i = 0; i < 7; i++) {
            grid[j][i] = map[grid[j][i]];
        }
    }

    // print grid        
    for (j = 0; j < 4; j++) {
        for (i = 0; i < 7; i++) {
            printf("%d ", grid[j][i]);
        }
        puts("");
    }

    return 0;
}

答案 1 :(得分:0)

1-复制基质(d)。这不会被修改,只是一个辅助。

2-对于(d)中的每个单元格,将(d)[单元格]与2列第2行中的每个单元格进行比较。

2.1-在匹配时,在结果矩阵中设置(之前已重复),第一列中单元格的值位于相同(d)位置。

3-返回修改过的矩阵。

答案 2 :(得分:0)

检查依赖关系,在更换器列值&lt; 2 3 1 6&gt;中。 &lt; 1&gt; 可以很容易地改变而不是依赖。之后,您需要保存每个Integer的状态。 取数组的商店索引位置,即 if(grid == 1)然后一个[] = grid.value; if(grid == 2)则分别为两个[] = grid,value; 。 现在,更改 grid [one []] = 2;和grid [two []] = 1; 简单。