码迷,mamicode.com
首页 > 编程语言 > 详细

C语言参数传递二维数组—保持城市天际线

时间:2018-05-16 22:27:11      阅读:402      评论:0      收藏:0      [点我收藏+]

标签:leetcode   传递   错误   keep   for   不能   printf   turn   简单   

今天做了LeetCode上的一道题,原理较简单,很容易相处解法,但是在编写代码过程中传递二维数组时总是会发生错误,因此总结了下如何传递:

参考博客   http://www.cnblogs.com/yangxi/archive/2012/03/22/2411452.html

题目 :在二维数组grid中,grid[i][j]代表位于某处的建筑物的高度。 我们被允许增加任何数量(不同建筑物的数量可能不同)的建筑物的高度。 高度 0 也被认为是建筑物。

最后,从新数组的所有四个方向(即顶部,底部,左侧和右侧)观看的“天际线”必须与原始数组的天际线相同。 城市的天际线是从远处观看时,由所有建筑物形成的矩形的外部轮廓。 请看下面的例子。

建筑物高度可以增加的最大总和是多少?

声明函数如:int maxIncreaseKeepingSkyline(int** grid){}

意在传递二维数组grid[4][4],如果进行调用maxIncreaseKeepingSkyline(grid或* grid[4] 或grid[] &grdi[0]); 等等格式都是错误的,根据不同编译器不同的设置,可能出现warning 或者error,

需要进行强制转换(int**)grid;  这样就ok了

maxIncreaseKeepingSkyline((int**)grid);

然后在maxIncreaseKeepingSkyline方法中访问grid[m][n]时 不能这样通过下标直接访问,需要通过编译器的方式访问  及 grid+n*i+j;在本题中访问方式为*((int*)grid +n*i+j))

源代码:本地调试通过,上传时测试用例错误,不知道为什么

#include<stdio.h>
//返回两个数中的最小数
int MaxNum(int a, int b) {
    if (a >= b)
        return b;
    else
        return a;

}
//分别找出二维数组中每行每列的最大值并存储在两个数组row和col中返回
void searchMaxHigher(int **grid, int row[], int col[], int gridRowSize, int *gridColSizes) {
    int i, j;
    //计算二维数组每行的最大值存储在row[]中
    for (i = 0; i<gridRowSize; i++) {
        row[i] = 0;
        for (j = 0; j< (*gridColSizes); j++)
        {
            if (row[i]< (*((int *)grid+ (*gridColSizes)*i + j)))
                row[i] = *((int *)grid + (*gridColSizes)*i + j);

        }
    }
    //计算二维数组每行的最大值存储在col[]中
    for (i = 0; i<(*gridColSizes); i++) {
        col[i] = 0;
        for (j = 0; j< gridRowSize; j++)
        {
            if (col[i]<(*((int *)grid + (*gridColSizes)*j + i)))
                col[i] = (*((int *)grid + (*gridColSizes)*j + i));

        }
    }
}
//找出每个元素的增加数并累加
int maxIncreaseKeepingSkyline(int** grid, int gridRowSize, int *gridColSizes) {
    int rowMax[50], colMax[50];
    int i, j;
    int sum = 0;
    searchMaxHigher( grid,  rowMax, colMax,  gridRowSize,  gridColSizes);
    for (i = 0; i<gridRowSize; i++)
        for (j = 0; j<(*gridColSizes); j++) {
            if ((*((int *)grid + (*gridColSizes)*i + j)) <= rowMax[i] && (*((int*)grid + (*gridColSizes)*i + j)) <= colMax[j]) {
                sum = sum + (MaxNum(rowMax[i], colMax[j]) - (*((int *)grid + (*gridColSizes)*i + j)));
            }


        }
    return sum;
}

void main() {
    int a[4][4] = { {3,0,8,4},{2,4,5,7},{9,2,6,3},{0,3,1,0} };
    int ** grid;
    int row = 4, col = 4;
    int sum = 0;
    
    sum=maxIncreaseKeepingSkyline((int **)a, row ,&col);

    printf("%d\n", sum);

}

 

C语言参数传递二维数组—保持城市天际线

标签:leetcode   传递   错误   keep   for   不能   printf   turn   简单   

原文地址:https://www.cnblogs.com/feifiefighting/p/9047972.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!