求助求助,有一个过不去
查看原帖
求助求助,有一个过不去
678478
StSnow楼主2022/3/18 19:56

思路是不断遍历数组,开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;
}
                                              '''
2022/3/18 19:56
加载中...