2017网易游戏雷火盘古实习生招聘笔试真题 2

来源:互联网 发布:我的世界0.14.0家具js 编辑:程序博客网 时间:2024/05/22 10:49
[编程题] 最大和

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

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


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

输入例子:
4 287 98 79 6110 27 95 7020 64 73 2971 65 15 0

输出例子:

193

#include <iostream> #include <vector>#include <string>  #include <math.h>   using namespace std;    int main()  {      int N,D;        vector<vector<int>> res;    //输入    cin>>N>>D;    int N_D = N-D;    for(int i=0;i<N;i++)    {        vector<int> single;        for(int k=0;k<N;k++){            int curr;            cin>>curr;            single.push_back(curr);        }        res.push_back(single);    }  //计算    int Wmax=0;      for(int i=0;i<N;i++){        for(int k=0;k<N;k++){            if(k<=N_D){            //右            int curr = 0;            for(int m=k;m<k+D;m++){                curr += res[i][m];            }                Wmax = max(curr,Wmax);            }            if(i<=N_D){            //下            int curr = 0;            for(int m=i;m<i+D;m++){                curr += res[m][k];            }            Wmax = max(curr,Wmax);            }                        if(i<=N_D&&k<=N_D){                //右斜            int curr = 0;            for(int m=i,n=k;m<i+D;m++,n++){                curr += res[m][n];            }            Wmax = max(curr,Wmax);            }                        if(k>=D-1&&i<=N_D){                //左斜            int curr = 0;            for(int m=i,n=k;m<i+D;m++,n--){                curr += res[m][n];            }            Wmax = max(curr,Wmax);            }                    }    }    cout <<Wmax;              return 0;  }  


1 0