将二维数组中的一个模式替换为另一个模式

发布于 2024-12-03 14:20:08 字数 795 浏览 1 评论 0原文

我正在尝试编写一个执行以下操作的方法:将数组 A 的每次出现替换为数组 B,其中 A 位于二维数组 C 内,然后返回修改后的数组。 A、B 和 C 是二维整数数组。

给定一个矩形数组 c 和另一个矩形数组 a,其中 a 的维度 <= c 的维度,找到与 a 匹配的 c 子数组的第一次出现,并用 b 替换该子数组(必​​须具有与 a) 相同的尺寸。

public class ReplacePatterns {
    public static void main(String[] args){

    }
    //replace every instance of the pattern a with the pattern b inside c.
    //find a way to get the dimensions of a 2D array
    public static int[][] replacePattern(int[][] a, int[][] b, int[][] c){
        for(int i = 0; i < c.length; i++){
            for(int j = 0; j < c[0].length; j++){
                if(c[i][j] == a[i][j]){ //c[i][j] should match up with a[0][0].
                    int[][] d; //copy the array inside c to d.
                }
            }
        }
    }
}

I'm trying to write a method that does the following: Replace every occurrence of the array A with the array B, where A is inside the 2D array C, then return the modified array. A, B, and C are 2-dimensional arrays of integers.

Given a rectangular array c, and another rectangular array a, with the dimensions of a <= those of c, find the first occurrence of a sub-array of c that matches a, and replace that sub-array with b (which must have the same dimensions as a).

public class ReplacePatterns {
    public static void main(String[] args){

    }
    //replace every instance of the pattern a with the pattern b inside c.
    //find a way to get the dimensions of a 2D array
    public static int[][] replacePattern(int[][] a, int[][] b, int[][] c){
        for(int i = 0; i < c.length; i++){
            for(int j = 0; j < c[0].length; j++){
                if(c[i][j] == a[i][j]){ //c[i][j] should match up with a[0][0].
                    int[][] d; //copy the array inside c to d.
                }
            }
        }
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

三寸金莲 2024-12-10 14:20:08

所以,假设我正确理解了这个问题,你想要这样的东西:

public class ReplacePatterns {

    //replace every instance of the pattern a with the pattern b inside c.
    //find a way to get the dimensions of a 2D array
    public static int[][] replace(int[][] a, int[][] b, int[][] c){
        for(int i = 0; i < c.length; i++){
            for(int j = 0; j < c[0].length; j++){
                if(c[i][j] == a[0][0]){ //c[i][j] should match up with a[0][0].
                    // Start verifying the rest of A
                    boolean flag = true;
                    for (int k = 0; k < a.length; k++) {
                        for (int l = 0; l < a[k].length; l++) {
                            if ((i+k) >= c.length || (j+l) >= c[0].length) {
                                flag = false;
                                break;
                            }
                            if (c[i+k][j+l] != a[k][l]) {
                                flag = false;
                            }
                        }
                    }
                    // If all the values for A were exactly the same, then replace it all with whatever is in B
                    if (flag) {
                        for (int k = 0; k < a.length; k++) {
                            for (int l = 0; l < a[k].length; l++) {
                                c[i+k][j+l] = b[k][l];
                            }
                        }
                    }
                }
            }
        }
        return c;
    }

    public static String prettyPrint(int[][] c) {
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < c.length; i++){
            for(int j = 0; j < c[0].length; j++){
                sb.append("[" + c[i][j] + "]");
            }
            sb.append("\n");
        }
        sb.append("\n");
        return sb.toString();
    }

    public static void test(int[][] patternA, int[][] patternB, int[][] patternC) {
        System.out.println("Pattern A:");
        System.out.println(prettyPrint(patternA));
        System.out.println("Pattern B:");
        System.out.println(prettyPrint(patternB));
        System.out.println("  Array C:");
        System.out.println(prettyPrint(patternC));

        int[][] result = ReplacePatterns.replace(patternA, patternB, patternC);

        System.out.println("  Result:");
        System.out.println(prettyPrint(result));
    }

    public static void main(String[] args){
        int[][] patternA, patternB, patternC;

        System.out.println("Test1:");
        patternA = new int[][]{{1,1}, {1,1}};
        patternB = new int[][]{{3,3}, {3,3}};
        patternC = new int[][]{{0,1,1,1}, {1,1,1,1}, {0,1,1,1}};
        test(patternA, patternB, patternC);

        System.out.println("Test2:");
        patternA = new int[][]{{1,1}, {1,1}};
        patternB = new int[][]{{5,6}, {7,8}};
        patternC = new int[][]{{0,1,1,1,0,1}, {1,1,1,0,1,1,1}, {0,1,1,1,1,1,1}};
        test(patternA, patternB, patternC);
    }
}

我什至在其中包含了两个测试以进行确认,但我很确定它适用于一般情况。它可能效率低下,并且可能不适用于大型数组,但在这种情况下它可以完成工作。

该程序以图形方式输出三个给定模式(A、B 和 C),并打印出 C 在替换发生后的外观。在第二次测试运行中,您应该看到如下内容:

Test2:
Pattern A:
[1][1]
[1][1]


Pattern B:
[5][6]
[7][8]


Array C:
[0][1][1][1][0][1]
[1][1][1][0][1][1]
[0][1][1][1][1][1]


Result:
[0][5][6][1][0][1]
[1][7][8][0][5][6]
[0][1][1][1][7][8]

So, assuming I understood the question correctly, you want something like this:

public class ReplacePatterns {

    //replace every instance of the pattern a with the pattern b inside c.
    //find a way to get the dimensions of a 2D array
    public static int[][] replace(int[][] a, int[][] b, int[][] c){
        for(int i = 0; i < c.length; i++){
            for(int j = 0; j < c[0].length; j++){
                if(c[i][j] == a[0][0]){ //c[i][j] should match up with a[0][0].
                    // Start verifying the rest of A
                    boolean flag = true;
                    for (int k = 0; k < a.length; k++) {
                        for (int l = 0; l < a[k].length; l++) {
                            if ((i+k) >= c.length || (j+l) >= c[0].length) {
                                flag = false;
                                break;
                            }
                            if (c[i+k][j+l] != a[k][l]) {
                                flag = false;
                            }
                        }
                    }
                    // If all the values for A were exactly the same, then replace it all with whatever is in B
                    if (flag) {
                        for (int k = 0; k < a.length; k++) {
                            for (int l = 0; l < a[k].length; l++) {
                                c[i+k][j+l] = b[k][l];
                            }
                        }
                    }
                }
            }
        }
        return c;
    }

    public static String prettyPrint(int[][] c) {
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < c.length; i++){
            for(int j = 0; j < c[0].length; j++){
                sb.append("[" + c[i][j] + "]");
            }
            sb.append("\n");
        }
        sb.append("\n");
        return sb.toString();
    }

    public static void test(int[][] patternA, int[][] patternB, int[][] patternC) {
        System.out.println("Pattern A:");
        System.out.println(prettyPrint(patternA));
        System.out.println("Pattern B:");
        System.out.println(prettyPrint(patternB));
        System.out.println("  Array C:");
        System.out.println(prettyPrint(patternC));

        int[][] result = ReplacePatterns.replace(patternA, patternB, patternC);

        System.out.println("  Result:");
        System.out.println(prettyPrint(result));
    }

    public static void main(String[] args){
        int[][] patternA, patternB, patternC;

        System.out.println("Test1:");
        patternA = new int[][]{{1,1}, {1,1}};
        patternB = new int[][]{{3,3}, {3,3}};
        patternC = new int[][]{{0,1,1,1}, {1,1,1,1}, {0,1,1,1}};
        test(patternA, patternB, patternC);

        System.out.println("Test2:");
        patternA = new int[][]{{1,1}, {1,1}};
        patternB = new int[][]{{5,6}, {7,8}};
        patternC = new int[][]{{0,1,1,1,0,1}, {1,1,1,0,1,1,1}, {0,1,1,1,1,1,1}};
        test(patternA, patternB, patternC);
    }
}

I even included two tests in there, for confirmation, but I'm pretty sure it will work for the general case. It's probably inefficient, and might not work for huge arrays, but it gets the job done in this case.

The program outputs graphically the three given patterns (A, B and C), and prints out how C looks after the replacement has taken place. In the second test run, you should see something like this:

Test2:
Pattern A:
[1][1]
[1][1]


Pattern B:
[5][6]
[7][8]


Array C:
[0][1][1][1][0][1]
[1][1][1][0][1][1]
[0][1][1][1][1][1]


Result:
[0][5][6][1][0][1]
[1][7][8][0][5][6]
[0][1][1][1][7][8]
微凉徒眸意 2024-12-10 14:20:08

下面演示了一种解决方案。请注意,我没有考虑优化代码以最小化模式检查。我确信存在更好的算法来查找模式。我采用了一种幼稚的方法来验证每个节点上的模式。代码里面有注释。

//replace every instance of the pattern a with the pattern b inside c.
    //find a way to get the dimensions of a 2D array
    public int[][] replacePattern(int[][] a, int[][] b, int[][] c) {

        //first make d as copy of array c
        int[][] d = new int[c.length][c[0].length];
        for (int i = 0; i < c.length; i++) {
            for (int j = 0; j < c[0].length; j++) {
                d[i][j] = c[i][j];
            }
        }

        //now scan array c for appearance of a. go over every node and on each node initiate a check if the pattern happens at that node
        //note the scan is done as long as we don't step out of array c dimensions
        for (int i = 0; i < c.length - a.length + 1; i++) {
            for (int j = 0; j < c[0].length - a[0].length + 1; j++) {
                //we verify pattern on each node as it can start on each of them
                boolean isPatternOcurring = true;
                for (int m = 0; m < a.length && isPatternOcurring; m++) {
                    for (int n = 0; j < a[0].length; n++) {
                        if (c[i + m][j + n] != a[m][n]) {
                            isPatternOcurring = false;
                            break;
                        }
                    }
                }

                //if pattern occurs, then copy b into d
                if (isPatternOcurring) {
                    for (int m = 0; m < b.length; m++)
                        for (int n = 0; j < b[0].length; n++) 
                            d[i + m][j + n] = b[m][n]; 


                }
            }
        }


        return d;

    }

One solution is demonstrated below. Please note that I did not give a thought on optimizing the code to minimize pattern checking. I am sure a better algorithm exists for finding the patterns. I took a naive approach of verifying the pattern on each node. notes inside the code.

//replace every instance of the pattern a with the pattern b inside c.
    //find a way to get the dimensions of a 2D array
    public int[][] replacePattern(int[][] a, int[][] b, int[][] c) {

        //first make d as copy of array c
        int[][] d = new int[c.length][c[0].length];
        for (int i = 0; i < c.length; i++) {
            for (int j = 0; j < c[0].length; j++) {
                d[i][j] = c[i][j];
            }
        }

        //now scan array c for appearance of a. go over every node and on each node initiate a check if the pattern happens at that node
        //note the scan is done as long as we don't step out of array c dimensions
        for (int i = 0; i < c.length - a.length + 1; i++) {
            for (int j = 0; j < c[0].length - a[0].length + 1; j++) {
                //we verify pattern on each node as it can start on each of them
                boolean isPatternOcurring = true;
                for (int m = 0; m < a.length && isPatternOcurring; m++) {
                    for (int n = 0; j < a[0].length; n++) {
                        if (c[i + m][j + n] != a[m][n]) {
                            isPatternOcurring = false;
                            break;
                        }
                    }
                }

                //if pattern occurs, then copy b into d
                if (isPatternOcurring) {
                    for (int m = 0; m < b.length; m++)
                        for (int n = 0; j < b[0].length; n++) 
                            d[i + m][j + n] = b[m][n]; 


                }
            }
        }


        return d;

    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文