【问题标题】:Copy char matrix (char**) without library functions复制没有库函数的字符矩阵(char**)
【发布时间】:2016-07-23 09:27:10
【问题描述】:

我需要做一个函数作为作业,给定一个由 T 和 A 组成的 char 矩阵,返回所述矩阵上的岛屿数量,在西班牙语中是 T 土地和 A 水。我能做的所有这些还有一个问题,我可以修改我作为参数给出的矩阵。我想在调用我的函数并发送新的函数之前复制矩阵,但我不能这样做。正如标题所说,我需要绝对没有任何类型的库函数(例如 strcopy)。我会传递我的代码以防万一:

int islands(char** map, int col, int row){
char** aux = map;//I don't think this line does anything
int cont = 0;
for (int i = 0; i < col; i++) {
    for (int j = 0; j < row; j++) {
        char c = aux[i][j];
        if (aux[i][j] =='T') {
            cont++;
            deleteLand(aux, i,j, col, row);
        }
    }
}
int a = cont;
return cont;
}


void deleteLand(char** map, int t1,int t2, int col, int row) {
map[t1][t2] = 'A';
for (int i = -1; i <= 1; i++) {
    for (int j = -1; j <= 1; j++) {
        if (!(i==0 && j ==0)&&(t1 + i >= 0 && t1 + i < col) && (t2 + j >= 0 && t2 + j < row)) {
            if (map[t1 + i][t2 + j] == 'T') {
                int tc = t1+i;
                int tr = t2 + j;
                deleteLand(map, tc,tr,col,row);
            }
        }
    }
}
}

以及它返回的示例: 条目:(['T','T','A' 'A','A','T' 'A','A','A' 'T','T','A'], 3, 4) 返回:2

希望它足够清楚。另外,在写这篇文章时,我意识到我可以在输入时保存矩阵的值并在退出时再次复制它,但我认为它实际上是相同的。非常感谢您提供的任何帮助

【问题讨论】:

  • 矩阵通常是二维数组的同义词。像char 这样的东西是“指向char 的指针”。它不能用于这样的构造。如果您需要二维数组,请使用:int (*array2d)[COLS]
  • 那不会只给我一行吗?
  • @BrunoVezoli 我需要在绝对没有库函数的情况下这样做 -- 所以没有什么能阻止你创建自己的函数库,即你自己的 strcpy 等。然后在更大的程序中使用它们,而不是试图将所有这些都塞进deleteLand 函数中。
  • aux 声明为char 的二维数组的C 语法为char aux[row][col];。 C 没有 new 运算符——那是 C++ 的东西。当然,您也标记了 C++,那么您实际使用的是哪种语言?它们是不同的。
  • char (*arr)[COLS] 是一个“指向char 数组的指针”(相当于char *p,它是一个“指向char”的指针)。您可以使用它来指向数组的第一个元素。现在自己想想这样一个数组的第一个元素是什么。请注意,您可以通过单个 memcpy 调用来复制这样的数组。 mallocfree 也是如此。 COLS 可以是局部变量或宏,例如#define COLS 100.

标签: c++ matrix


【解决方案1】:

要复制数组(数组中的数据),您需要为其分配空间。使用副本后,您应该释放内存。


我想在这种情况下复制数据的唯一原因是恢复map中的原始数据。如果是这样,更好的解决方案是使用另一个字母“B”来掩盖deleteLand 中访问过的岛屿。然后在你完成后,你可以快速恢复原始地图,将所有B变为T。它避免了分配和释放内存的所有问题。

编辑:我不得不删除 C++ 中的实际代码,因为同时删除了 C++ 标签。

【讨论】:

  • 嗯,改成“B”是解决这里所有问题的好方法。我刚刚根据@PaulMcKenzie 的建议完成了我的方法的创建。非常感谢 Paul 我会发布我的解决方案以防万一
  • 问题标记为 C。
  • @Olaf 在我写这篇评论时它被标记为 c++。我应该编辑它吗?
  • @Olaf 这是对我投反对票的原因吗?
  • 不要在没有证据的情况下指责某人 DV。 1)如果她认为没有用,这是该人的权利 2)DV和评论之间没有必要的关联。
【解决方案2】:

正如我在评论中发布的那样,我可以在 PaulMcKenie 的帮助下解决问题,我将发布代码以防万一它对任何人有用。

char** copyMatrix(char ** mat, int cols) {
char** newMat = new char*[cols];
for (int i = 0; i < cols; i++) {
    newMat[i] = copyStr(mat[i]);
}
return newMat;
}

而且,正如我之前提到的,我不能使用库函数,所以我也会发布 copyStr:

char* copyStr(char* string) {
char* copia = new char[strLen(string)];
int i = 0;
while (*string) {
    copia[i] = *string;
    *string++;
    i++;
}
copia[i] = *string;
return copia;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 2015-11-20
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    相关资源
    最近更新 更多