题目描述(题目链接)
从键盘输入一个整型二维数组,遍历二维数组中的每个元素,如果此元素比其上下左右的数字都大,即为山顶元素。
输入格式
一个≥1的整数,表名是几行几列的二维数组,一个整型二维数组,数据之间都用空格分开。
输出格式
所有整型山顶元素,用空格分开。
输入输出样例
输入
5
15 39 5 15 18
41 39 0 6 41
38 38 38 30 44
33 36 10 35 39
39 12 4 39 7
输出
41 44 39 39
说明/提示
如果输入的代表几行几列的整数≤0,输出此整数。
解题思路:
读题意,从一个点对其上下左右进行遍历加以比较,注意下题目最后的说明/提示,意思是当n=0时,输出0
解题代码:
C代码:
#include<stdio.h>
#include<stdbool.h>//bool类型
int n;
int r[4]={0,0,1,-1};//左右
int c[4]={1,-1,0,0};//上下
bool fw(int row,int column)//判断是否在范围内
{
return row>=0&&row<n&&column>=0&&column<n?true:false;
}
bool dfs(int a[n][n],int i,int j)
{
int flag=1;
for(int k=0;k<4;k++)//遍历上下左右的元素
{
int row=r[k]+i,column=c[k]+j;
if(fw(row,column))
{
if(a[i][j]<=a[row][column])
{
flag=0;
break;
}
}
}
return flag;
}
int main()
{
scanf("%d",&n);
if(n==0)
{
printf("0");
return 0;
}
int a[n][n];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&a[i][j]);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(dfs(a,i,j))
printf("%d ",a[i][j]);
}
return 0;
}
C++代码:
在C++中二维数组传参时,参数中的数组大小必须是常量,就不能像C那样随意这样a[n][n]
当函数参数,除非是全局变量,全局变量也就没必要传参了
#include<bits/stdc++.h>
using namespace std;
int n;
int r[4]={0,0,1,-1};
int c[4]={1,-1,0,0};
bool fw(int row,int column)
{
return row>=0&&row<n&&column>=0&&column<n?true:false;
}
bool dfs(int **a,int i,int j)//这里弄了个二级指针,还有些麻烦了
{
int flag=1;
for(int k=0;k<4;k++)
{
int row=r[k]+i,column=c[k]+j;
if(fw(row,column))
{
if(a[i][j]<=a[row][column])
{
flag=0;
break;
}
}
}
return flag;
}
int main()
{
cin>>n;
if(n==0)
{
cout<<0;
return 0;
}
int **a=new int *[n];//二级指针的定义,我感觉还是有些麻烦的
for (int i = 0; i < n; ++i) {
a[i] = new int[n];
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>a[i][j];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(dfs(a,i,j))
cout<<a[i][j]<<" ";
}
return 0;
}