7-17 求矩阵的局部极大值分数 15全屏浏览题目切换布局作者 徐镜春单位 浙江大学

7-17 求矩阵的局部极大值

分数 15

全屏浏览题目

切换布局

作者 徐镜春单位 浙江大学

给定MN列的整数矩阵A,如果A的非边界元素A[i][j]大于相邻的上下左右4个元素,那么就称元素A[i][j]是矩阵的局部极大值。本题要求给定矩阵的全部局部极大值及其所在的位置。

输入格式:

输入在第一行中给出矩阵A的行数M和列数N(3≤M,N≤20);最后M行,每行给出A在该行的N个元素的值。数字间以空格分隔。

输出格式:

每行按照“元素值 行号 列号”的格式输出一个局部极大值,其中行、列编号从1开始。要求按照行号递增输出;若同行有超过1个局部极大值,则该行按列号递增输出。若没有局部极大值,则输出“None 总行数 总列数”。

输入样例1:

4 5
1 1 1 1 1
1 3 9 3 1
1 5 3 5 1
1 1 1 1 1

输出样例1:

9 2 3
5 3 2
5 3 4

输入样例2:

3 5
1 1 1 1 1
9 3 9 9 1
1 5 3 5 1

输出样例2:

None 3 5

代码长度限制16 KB

时间限制400 ms

内存限制64 MB

#include<stdio.h>
int main()
{
    int flag = 0;            //定义信号变量,如满足条件,改变其值来实现代码输出结果
    int m,n,i,j;
    scanf("%d %d",&m,&n);
    int arr[m][n];
    for(i=0;i<m;i++)
        for(j=0;j<n;j++)
            scanf("%d",&arr[i][j]);        //数组的赋值
    for(i=1;i<m-1;i++)                    //双层循环,第一个控制行,第二个控制列,注意循环进行的条件
    {
        for(j=1;j<n-1;j++)                
        if((arr[i][j] > arr[i+1][j]) && (arr[i][j] > arr[i][j+1]) && (arr[i][j] > arr[i-1][j]) && (arr[i][j] > arr[i][j-1]))
        {
            printf("%d %d %d\n",arr[i][j],i+1,j+1);  //打印并换行,注意题目下标从1开始,所以i,j打印值需加一
            flag = 1;    //满足条件时,信号分子值发生改变
        }
    }
    if(!flag)            //“!”即将非0改变为0,0改变为非0
    printf("None %d %d\n",m,n);
    return 0;
}

此题难度不大,认真审题,推出循环条件和判断条件即可写出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 给定m行n列的整数矩阵a,要找出其中所有的局部极大值局部极大值的定义为:如果a的非边界元素a[i][j]大于相邻的上下左右4个元素,那么就称元素a[i][j]是矩阵局部极大值。需要出所有局部极大值及其所在的位置。 ### 回答2: 对于给定的m行n列的整数矩阵a,要找到矩阵中的全部局部极大值及其所在位置。我们可以使用遍历算法,逐一访问矩阵中的每一个非边界元素,判断它是否为局部极大值。 对于一个非边界元素a[i][j],如果它大于相邻的上下左右4个元素,就说明它是一个局部极大值。我们可以使用简单的if语句进行判断,如果满足条件就将这个元素及其位置保存到结果集合中。 具体实现过程如下: ```python result = [] for i in range(1, m-1): for j in range(1, n-1): if a[i][j] > a[i-1][j] and a[i][j] > a[i+1][j] and a[i][j] > a[i][j-1] and a[i][j] > a[i][j+1]: result.append((a[i][j], i, j)) ``` 遍历过程中我们只访问了非边界元素,因此不用考虑越界问题。 最后我们得到的结果集合result包含了全部局部极大值及其所在的位置,可以进行后续处理或出。这是一个时间复杂度为O(mn)的简单算法,适用于小规模的矩阵。如果矩阵较大,可以考虑使用更高效的算法来减少时间复杂度。 ### 回答3: 本题是一道典型的矩阵查找题目,需要遍历整个矩阵来判断每一个数字是否为局部极大值。 具体地,我们可以通过两层for循环遍历整个矩阵,对于矩阵中的每一个元素a[i][j],我们可以先判断它是否为边界元素。如果不是边界元素,那么我们就可以通过比较a[i][j]和上下左右四个元素来判断它是否为局部极大值,如果是的话,就出它及其所在的位置。 具体实现过程中,我们可以在内层循环中加上一些判断条件,来减少不必要的计算量。比如,当a[i][j]小于等于它的四个相邻元素时,我们就可以直接跳过该元素,因为它不可能是局部极大值。同时,当a[i][j]已经被判定为局部极大值时,我们也可以直接跳过它的四个相邻元素,因为它们不可能再成为局部极大值了。 综上所述,本题的解决方法是先遍历整个矩阵,对于每一个元素a[i][j],判断它是否为局部极大值,如果是,就出它及其所在的位置。在实现的过程中,使用一些判断条件可减少不必要的计算量,提高代码效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值