面试题 最大和

链接:https://www.nowcoder.com/question/next?pid=4111169&qid=76265&tid=17079055

时间限制:1秒

空间限制:32768K

在一个N*N的数组中寻找所有横,竖,左上到右下,右上到左下,四种方向的直线连续D个数字的和里面最大的值 

输入描述:

每个测试输入包含1个测试用例,第一行包括两个整数 N 和 D :
3 <= N <= 100
1 <= D <= N
接下来有N行,每行N个数字d:
0 <= d <= 100

输出描述:

输出一个整数,表示找到的和的最大值

输入例子1:

4 2
87 98 79 61
10 27 95 70
20 64 73 29
71 65 15 0

输出例子1:

193

代码实现如下:

#include<iostream>
using namespace std;

int main(){
	int N,D;
	cin>>N>>D;
	int arr[101][101] = {0};
	
	for(int i=1;i<=N;i++)
		for(int j=1;j<=N;j++)
			cin>>arr[i][j];

	int maxSum = -99999;
	int sum;
	for(int i = 1;i<=N;i++){
		for(int j = 1;j<=N;j++){
			sum = 0;
			//横向
			if(j <= N-D+1){
				for(int k=j;k<=j+D-1;k++)
					sum += arr[i][k];
				if(sum > maxSum) maxSum = sum;
			}
			
			sum = 0;
			//纵向
			if(i <= N-D+1){
				for(int k=i;k<=i+D-1;k++)
					sum += arr[k][j];
				if(sum > maxSum) maxSum = sum;
			}  
			
			sum = 0;
			//左上到右下
			if(i <= N-D+1 && j <= N-D+1){
				for(int k=i,z=j;k<=i+D-1,z<=j+D-1;k++,z++)
						sum += arr[k][z];
				if(sum > maxSum) maxSum = sum;
			} 
			
			sum = 0;
			//右上到左下
			if(i <= N-D+1 && j >= D){
				for(int k=i,z=j;k<=i+D-1,z>=j-D+1;k++,z--)
						sum += arr[k][z];
				if(sum > maxSum) maxSum = sum;
			} 	
		}
	}
	cout<<maxSum<<endl; 
	
	return 0;
}

运行结果如下:

猜你喜欢

转载自blog.csdn.net/qq_29762941/article/details/81273522