代码之家  ›  专栏  ›  技术社区  ›  Prav

二维矩形网格

  •  0
  • Prav  · 技术社区  · 5 年前

    我试图在 https://nus.kattis.com/problems/apples

    #include <stdio.h>
    
    int main(){
    
        int r,c;
        scanf("%d",&r);
        scanf("%d",&c);
        char arr[r][c];
        for (int i=0; i<r;i++){
            for(int j=0;j<c;j++){
                if(arr[i][j]=='a' && arr[i+1][j]=='.'){
                    arr[i][j] = '.';
                    arr[i+1][j] = 'a';
                }
            }
        }
        for(int i=0;i<r;i++){
            for(int j=0;j<c;j++){
                printf("%c",arr[i][j]);
            }
        }
    }
    

    如果非要我猜,我会用手指检查arr[I][j]是否等于a,因为arr[I][j]的“a”与普通的“a”地址不同。

    1 回复  |  直到 5 年前
        1
  •  0
  •   dvhh    5 年前

    如前所述,您缺少初始的网格读取代码。

    因为它是一个二维网格 two way of storing the data

    • row major(您所做的方式,也是组织数据的一种自然方式),其中数据存储在一个行数组中
    • column major,其中数据存储在列数组中

    在主要的列中存储数据将是一个更有利的问题。但为了完整起见,我会给你们两种储存方法

    // Row major
    char arr[r][c];
    int count = 0;
    int ch;
    while (EOF != (ch = fgetc(fp))) {
        if(ch!='a' && ch != '#' && ch != '.') continue;
        row = count / c;
        col = count % c;
        arr[row][col] = ch;
    }
    
    // Col major
    char arr[c][r];
    int count = 0;
    int ch;
    while (EOF != (ch = fgetc(fp))) {
        if(ch!='a' && ch != '#' && ch != '.') continue;
        row = count / c;
        col = count % c;
        arr[col][row] = ch;
    }
    

    我之所以推荐你用大容量存储列,是因为如果你分别对待每一列,问题会得到更好的解决。

        2
  •  2
  •   Gratus    5 年前

    您的代码没有正确读取输入(网格的内容)。在检查条件和执行更多任务之前,必须使用scanf或其他输入函数从标准输入中读取。

    不过,如果你宣布 r * c r th索引打开 arr[i+1][j]=='.' 部分。应该通过声明稍微大一点的数组或修改逻辑来避免这种情况。