在两列中查找匹配项并替换

Finding matches in two columns and replace

我有两列,其中每个字段都有一个 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

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

我该如何解决?

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

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

编辑:我有这样的输入:

Table 次交流

3 2
4 1

Table更正

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 代替 4 之外,我没有其他对 2 的引用,但大多数情况下都是这样。 我做的是直接去把3换成2,把1换成4。

1- 复制矩阵 (d)。这个不会修改,只是一个aux.

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

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

3-Return矩阵修改。

检查依赖项,在转换器列值 <2 3 1 6> 中。 <1 6> 可以轻松更改且不依赖。之后,您需要为每个整数保存状态。 取数组作为存储索引位置,即 if(grid==1) then one[]=grid.value; if(grid==2) then two[]=grid,value; 分别。 现在,改变 grid[one[]]=2;和 grid[two[]]=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;
}