1 /* 2 题意:给你一个n*n的格子,每一个格子都有一个数值!将两只bishops放在某一个格子上, 3 每一个bishop可以攻击对角线上的格子(主对角线和者斜对角线),然后会获得格子上的 4 数值(只能获取一次)。要求输出两个bishops获取的最大值以及它们所在的位置! 5 6 7 思路:直接暴力!....不错的暴力题目! 8 首先我们都知道每一条主对角线上的横纵坐标的和相同,每一条副对角线上的横纵坐标的差相同! 9 那么我们在输入的时候就可以将所有对角线上的数值之和求出来了! 10 11 最后我们发现如果要获得最大值,那么还有一条就是两个bishops所在的对角线不能相交在 12 同一个格子上!只要满足两个bishops的哼纵坐标之和互为奇偶就可以了! 13 14 在所有格子中找到横纵坐标之和为奇数并且获得对角线上数值最大的格子和横纵坐标之 15 和为偶数并且获得对角线上数值最大的格子! 16 二者最大获得值相加就是最终的答案了! 17 */ 18 #include<iostream> 19 #include<cstring> 20 #include<cstdio> 21 #include<algorithm> 22 #define N 2005 23 using namespace std; 24 typedef long long LL; 25 int num[N][N]; 26 LL sumN[N*2], sumM[N*2]; 27 28 int n; 29 30 int main(){ 31 while(scanf("%d", &n)!=EOF){ 32 memset(sumN, 0, sizeof(sumN)); 33 memset(sumM, 0, sizeof(sumM)); 34 for(int i=1; i<=n; ++i) 35 for(int j=1; j<=n; ++j){ 36 scanf("%d", &num[i][j]); 37 sumN[i+j]+=num[i][j];//横纵坐标之和为i+j的对角线的数值和 38 sumM[i-j+n]+=num[i][j];//横纵坐标之差为i-j的对角线的数值和 39 } 40 41 LL maxOdd=-1, maxEvent=-1, s; 42 int x1, x2, y1, y2; 43 for(int i=1; i<=n; ++i) 44 for(int j=1; j<=n; ++j){ 45 if((i+j)&1){ 46 if(maxOdd<(s=sumN[i+j]+sumM[i-j+n]-num[i][j])){ 47 maxOdd=s;//横纵坐标之和为奇数并且获得对角线上数值最大的格子 48 x1=i; 49 y1=j; 50 } 51 } 52 else{ 53 if(maxEvent<(s=sumN[i+j]+sumM[i-j+n]-num[i][j])){ 54 maxEvent=s;//横纵坐标之和为偶数并且获得对角线上数值最大的格子 55 x2=i; 56 y2=j; 57 } 58 } 59 } 60 61 printf("%lld ",maxOdd+maxEvent); 62 printf("%d %d %d %d ", x1, y1, x2, y2); 63 } 64 return 0; 65 }