在一个N*N的数组中寻找所有横,竖,左上到右下,右上到左下,四种方向的直线连续D个数字的和里面最大的值
输入描述:
每个测试输入包含1个测试用例,第一行包括两个整数 N 和 D : 3 <= N <= 100 1 <= D <= N 接下来有N行,每行N个数字d: 0 <= d <= 100
输出描述:
输出一个整数,表示找到的和的最大值
输入例子:
4 2 87 98 79 61 10 27 95 70 20 64 73 29 71 65 15 0
输出例子:
193
基本思路:分四种情况获取所求和:
1、从左到右,按行去遍历数组
2、从上到下,按列遍历数组
3、从左上到右下遍历数组
4、从左下到右上遍历数组
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,d;
cin>>n>>d;
int** p = new int*[n];
int max_sum=0;
for (int i = 0; i <n; ++i)
{
p[i] = new int[n];
}
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
cin >> p[i][j];
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n-d+1;j++)
{
int sum=0;
for(int k=j;k<j+d;k++)
{
sum+=p[i][k];
}
if(max_sum<sum)
max_sum=sum;
}
}
for(int j=0;j<n;j++)
{
for(int i=0;i<n-d+1;i++)
{
int sum=0;
for(int k=i;k<i+d;k++)
{
sum+=p[k][j];
}
if(max_sum<sum)
max_sum=sum;
}
}
for(int i=0;i<n-d+1;i++)
{
for(int j=0;j<n-d+1;j++)
{
int sum=0;
int q=j;
for(int k=i;k<d+i;k++)
{
sum+=p[k][q];
q++;
}
if(max_sum<sum)
max_sum=sum;
}
}
for(int i=n-1;i>=d-1;i--)
{
for(int j=0;j<n-d+1;j++)
{
int sum=0;
int q=j;
for(int k=i;k>=i-d+1;k--)
{
sum+=p[k][q];
q++;
}
if(max_sum<sum)
max_sum=sum;
}
}
cout<<max_sum<<endl;
/*
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
cout<<p[i][j]<<" ";
cout<<endl;
}
*/
return 0;
}