Gargari is jealous that his friend Caisa won the game from the previous problem. He wants to prove that he is a genius.
He has a n × n chessboard. Each cell of the chessboard has a number written on it. Gargari wants to place two bishops on the chessboard in such a way that there is no cell that is attacked by both of them. Consider a cell with number x written on it, if this cell is attacked by one of the bishops Gargari will get x dollars for it. Tell Gargari, how to place bishops on the chessboard to get maximum amount of money.
We assume a cell is attacked by a bishop, if the cell is located on the same diagonal with the bishop (the cell, where the bishop is, also considered attacked by it).
The first line contains a single integer n (2 ≤ n ≤ 2000). Each of the next n lines contains n integers aij (0 ≤ aij ≤ 109) — description of the chessboard.
On the first line print the maximal number of dollars Gargari will get. On the next line print four integers: x1, y1, x2, y2 (1 ≤ x1, y1, x2, y2 ≤ n), where xi is the number of the row where the i-th bishop should be placed, yi is the number of the column where the i-th bishop should be placed. Consider rows are numbered from 1 to n from top to bottom, and columns are numbered from 1 to n from left to right.
If there are several optimal solutions, you can print any of them.
4 1 1 1 1 2 1 1 0 1 1 1 0 1 0 0 1
12 2 2 3 2
在半个小时的时候,思路就出来了,后来实现时自己把自己绕进去了,悲哀,其实特别简单,斜着的判断,左上到右下的i+j相同,右上到左下的i-j相同,还有重点的判断,其实两个点i+j的奇偶性不同就行了。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; const int maxn=2000+100; int a[maxn][maxn]; long long hash1[2*maxn+10]; long long hash2[2*maxn+10]; queue<int> xz; queue<int> yz; int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { scanf("%d",&a[i][j]); } } memset(hash1,0,sizeof(hash1)); memset(hash2,0,sizeof(hash2)); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { hash1[i+j]+=a[i][j]; hash2[i-j+maxn]+=a[i][j]; } } long long ans,max1=0,max2=0; int x1=1,y1=1; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if((hash1[i+j]+hash2[i-j+maxn]-a[i][j])>max1) { max1=hash1[i+j]+hash2[i-j+maxn]-a[i][j]; x1=i; y1=j; } } } int x2=1; int y2=2; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if((i+j)%2==!((x1+y1)%2)) { if(hash1[i+j]+hash2[i-j+maxn]-a[i][j]>max2) { max2=hash1[i+j]+hash2[i-j+maxn]-a[i][j]; x2=i; y2=j; } } } } ans=max1+max2; printf("%I64d\n",ans); printf("%d %d %d %d\n",x1,y1,x2,y2); return 0; }