StSnow @ 2022-03-18 19:56:02
思路是不断遍历数组,开3维数组三个二维数组,一个放高度,一个记录状态。
不断循环遍历,
第一次的时候,如果一个位置的四周高度均高于它,则状态为0,否则为1;
之后只在状态为1的地方比较,不断取成0,直到全为0时,循环次数就是最长的坡度。
简单地说就是不断相互比较。
只有第二个数据点超时了,搞不明白,求教大佬。
附上代码------------
'''cpp
#include <iostream>
using namespace std;
bool can(int ***arr ,int a,int b,int m,int n);
int main(){
int m ,n ,***matrix ,i ,j ,count,out=0;
matrix=new int**[3];
cin>>m>>n ;
matrix[0]=new int*[m];
matrix[1]=new int*[m];
matrix[2]=new int*[m];
for (i=0 ;i<m ;i++ ){
matrix[0][i]=new int[n];
matrix[1][i]=new int[n];
matrix[2][i]=new int[n];
for (j=0 ;j<n ;j++) {
cin>>matrix[0][i][j];
matrix[1][i][j]=1;
matrix[2][i][j]=1;
}
}
do{
out++;
count=0;
for (i=0 ;i<m ;i++){
for (j=0 ;j<n ;j++ ){
if (can(matrix,i,j,m,n)) count++;
else matrix[1][i][j]=0;
}
}
for (i=0 ;i<m ;i++ )
for (j=0 ;j<n ;j++ ) matrix[2][i][j]=matrix[1][i][j];
}while(count);
cout<<out;
for (i=0 ;i<m ;i++){
for (j=0 ;j<3 ;j++ ) delete[] matrix[j][i];
}
for (i=0 ;i<3 ;i++ ) delete[] matrix[i];
delete[] matrix;
return 0;
}
bool can(int ***arr ,int a,int b,int m,int n){
if (a>0 && arr[0][a-1][b]<arr[0][a][b] && arr[2][a-1][b]==1) return true;
else if (a<m-1 && arr[0][a+1][b]<arr[0][a][b] && arr[2][a+1][b]==1) return true;
else if (b>0 && arr[0][a][b-1]<arr[0][a][b] && arr[2][a][b-1]==1) return true;
else if (b<n-1 && arr[0][a][b+1]<arr[0][a][b] && arr[2][a][b+1]==1) return true;
return false;
}
'''
by x1902129897 @ 2022-03-22 00:53:13
大佬我可以问下为什么map数组中为什么是a[x][y]在变而不是a[y][x]在变啊
by x1902129897 @ 2022-03-22 00:55:02
@x1902129897 a[x][y]>a[xx][yy])而不是a[y][x]>a[yy][xx])