内容会持续更新,有错误的地方欢迎指正,谢谢!
题目
在一个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
分析
先计算横的最大值,再计算竖的最大值,最后计算斜线的最大值。
代码
#include <iostream>
using namespace std;
int main()
{
int N,D;
cin>>N>>D;
int arr[105][105]={0};
for(int i=0;i<N;++i)
for(int j=0;j<N;++j)
cin>>arr[i][j];
int maxVal=0;
int i=0,j=0,k=0;
int sum=0;
//横着的情况
for(i=0;i<N;++i)//从0到N-1行
{
for(j=0;j<N;++j)//每一行内
{
sum=0;
for(k=0;k<D;++k)//D个数相加
{
if(j+k>=N)
break;
sum+=arr[i][j+k];
}
if(sum>maxVal)
maxVal=sum;
}
}
//竖着的情况
for(i=0;i<N;++i)//从0到N-1列
{
for(j=0;j<N;++j)//每一列内
{
sum=0;
for(k=0;k<D;++k)//D个数相加
{
if(j+k>=N)
break;
sum+=arr[j+k][i];
}
if(sum>maxVal)
maxVal=sum;
}
}
//左上到右下
for(i=0;i<N-D+1;++i)//由于一定要是连续D个数的和,所以要排除D-1个数的和大于D个数的和的情况
{
for(j=0;j<N;++j)
{
sum=0;
for(k=0;k<D;++k)//D个数相加
{
if(j+k>=N||i+k>=N)
break;
sum+=arr[i+k][j+k];//沿对角线方向延伸k的长度
}
if(sum>maxVal)
maxVal=sum;
}
}
//右上到左下
for(i=0;i<N-D+1;++i)//由于一定要是连续D个数的和,所以要排除D-1个数的和大于D个数的和的情况
{
for(j=N-1;j>=0;--j)
{
sum=0;
for(k=0;k<D;++k)//D个数相加
{
if(j-k<0||i+k>=N)
break;
sum+=arr[i+k][j-k];//沿对角线方向延伸k的长度
}
if(sum>maxVal)
maxVal=sum;
}
}
cout<<maxVal<<endl;
return 0;
}