题目描述(题目链接)
从键盘输入一个整型二维数组,遍历二维数组中的每个元素,如果此元素比其上下左右的数字都大,即为山顶元素。
输入格式
一个≥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;
}