1. 程式人生 > 其它 >Gargari and Bishops CodeForces - 463C

Gargari and Bishops CodeForces - 463C

原題連結
考察:思維
錯誤思路:
  預處理對角線和,列舉每一個點,發現與該點相鄰的點都不衝突.
錯誤原因:
  但凡圖畫大點就可以發現不止是相鄰的點,也不是用相鄰的點對角線路過的點.
思路:
  正解是與列舉點奇偶性不同的點.....直接暴力列舉完事.

Code

#include <iostream> 
#include <cstring>
using namespace std;
typedef long long LL;
const int N = 2010;
int mp[N][N],n;
LL zs[N<<1],fs[N<<1];
void init()
{
	for(int i=1;i<=n;i++)
	  for(int j=1;j<=n;j++)
	  {
	  	zs[j-i+n]+=mp[i][j];
	  	fs[j+i]+=mp[i][j];
	  }
}
void solve()//兩座標同奇或同偶數,就不合法 
{
	LL res_1 = -100,res_2 = -100;
	int xx[2] ={0},yy[2] = {0};
	for(int i=1;i<=n;i++)
	  for(int j=1;j<=n;j++)
	    if(i+j&1)
	    {
	    	LL t = zs[j-i+n]+fs[i+j]-mp[i][j];
	    	if(t>res_1) res_1 = t,xx[0] = i,yy[0] = j;
		}
	for(int i=1;i<=n;i++)
	  for(int j=1;j<=n;j++)
	    if(!(i+j&1))
	    {
	    	LL t = zs[j-i+n]+fs[i+j]-mp[i][j];
	    	if(t>res_2) res_2 = t,xx[1] = i,yy[1] = j;
		}
	printf("%lld\n%d %d %d %d\n",res_1+res_2,xx[0],yy[0],xx[1],yy[1]);
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	  for(int j=1;j<=n;j++) scanf("%d",&mp[i][j]);
	init();
	solve();
	return 0;
}