热身训练-k皇后问题(主副对角线计算)

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).

Input

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.

Output

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.

Example

Input

41 1 1 12 1 1 01 1 1 01 0 0 1

Output

122 2 3 2此题思路就是计算每一个位置所能收获的价值,用一个变量来存取最大值。利用的重点每一条主对角线的x-y是一个定值而每一个副对角线之和x+y是一个定值;
#include<stdio.h>
const int N = 2005;
typedef long long LL;
LL Map[N][N];
LL L[N*2];//主对角线
LL R[N*2];//副对角线
int main()
{
    int n;
    scanf("%d",&n);
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= n; j++) {
            scanf("%I64d",&Map[i][j]);
            L[i-j+n] += Map[i][j];//主对角线下x,y之和为定值n为确保不会出现负值
            R[i+j] += Map[i][j];//副对角线x,y之差为定值
        }
    }//显然比下文常规算法更简短易懂/*for(int i=0;i<n;i++)        {            for(int j=0;j<n;j++)            {                m=0;                if(i>=j)                {                    for(int x=0;x<n-i+j;x++)                    {                        m=m+a[i-j+x][x];                    }                }                else                {                    for(int x=0;x<n-j+i;x++)                    {                        m=m+a[x][j-i+x];                    }                }                if(i+j<=n)                {                    for(int x=0;x<i+j+1;x++)                    {                        m=m+a[x][i+j-x];                    }                }                else                {                    for(int x=n-1;x>i+j-n;x--)                    {                        m=m+a[x][i+j-x];                    }                }                m=m-a[i][j];                if(m>m1)                {                    m1=m;                    x1=i+1;                    y1=j+1;                }            }        }*/
    int x1 = 1, x2 = 1, y1 = 1, y2 = 2;
    LL max1 = 0, max2 = 0;
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= n; j++) {
            LL tmp = L[i+j] + R[i-j+n] - Map[i][j];
            if((i+j) % 2 == 0 && tmp > max1) {
                max1 = tmp;
                x1 = i;
                y1 = j;
            }
            if((i + j) % 2 == 1 && tmp > max2) {
                max2 = tmp;
                x2 = i;
                y2 = j;
            }
        }
    }
    printf("%I64d\n", max1 + max2);
    printf("%d %d %d %d\n", x1, y1, x2, y2);
}
时间: 2025-01-08 00:14:33

热身训练-k皇后问题(主副对角线计算)的相关文章

【开源】专业K线绘制[K线主副图、趋势图、成交量、滚动、放大缩小、MACD、KDJ等)

这是最近一个iOS项目需要使用的K线的绘制,在网上大量查阅资料无果,只好自行绘制. 实时数据使用来源API: https://www.btc123.com/kline/klineapi 返回数据说明: 1.时间戳 2.开盘价 3.最高价 4.最低价 5.收盘价 6.成交量 实现功能包括K线主副图.趋势图.成交量.滚动.放大缩小.MACD.KDJ,长按显示辅助线等功能 预览图 最后的最后,这是项目的开源地址:https://github.com/yate1996/Y_KLine,如果帮到了你,麻烦

专业K线绘制之K线主副图、趋势图、成交量、滚动、放大缩小、MACD、KDJ等【开源】

这是最近一个iOS项目需要使用的K线的绘制,在网上大量查阅资料无果,只好自行绘制. 返回数据说明: 1.时间戳 2.开盘价 3.最高价 4.最低价 5.收盘价 6.成交量 实现功能包括K线主副图.趋势图.成交量.滚动.放大缩小.MACD.KDJ,长按显示辅助线等功能 预览图 最后的最后,这是项目的开源地址:https://github.com/yate1996/Y_KLine,如果帮到了你,麻烦点赞鼓励鼓励呗~(*^__^*) ~

洛谷2105 k皇后

P2105 K皇后 题目描述 小Z最近捡到了一个棋盘,他想在棋盘上摆放K个皇后.他想知道在他摆完这K个皇后之后,棋盘上还有多少了格子是不会被攻击到的. (Ps:一个皇后会攻击到这个皇后所在的那一行,那一列,以及两条对角线) 输入输出格式 输入格式: 第一行三个正整数 n,m,K,表示棋盘的行列,以及小Z摆放了K个皇后. 接下来K行,每行两个正整数x,y,表示这个皇后被摆在了第x行,第y列,数据保证没有任何两个皇后会被摆在同一个格子里. 输出格式: 一行一个整数,表示棋盘上还有多少了格子是不会被攻

洛谷 P2105 K皇后

P2105 K皇后 题目描述 小Z最近捡到了一个棋盘,他想在棋盘上摆放K个皇后.他想知道在他摆完这K个皇后之后,棋盘上还有多少了格子是不会被攻击到的. (Ps:一个皇后会攻击到这个皇后所在的那一行,那一列,以及两条对角线) 输入输出格式 输入格式: 第一行三个正整数 n,m,K,表示棋盘的行列,以及小Z摆放了K个皇后. 接下来K行,每行两个正整数x,y,表示这个皇后被摆在了第x行,第y列,数据保证没有任何两个皇后会被摆在同一个格子里. 输出格式: 一行一个整数,表示棋盘上还有多少了格子是不会被攻

算法训练 K好数【蓝桥杯】

算法训练 K好数 时间限制:1.0s   内存限制:256.0MB 问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = 4,L = 2的时候,所有K好数为11.13.20.22.30.31.33 共7个.由于这个数目很大,请你输出它对1000000007取模后的值. 输入格式 输入包含两个正整数,K和L. 输出格式 输出一个整数,表示答案对1000000007取模后的值. 样例输入 4 2 样例输出 7

练习1:将一个6*6数组的第一行,第六行,主对角线和副对角线上的元素都存1,其他元素都存成-1,不需使用初始化,尽量少使用循环

暂时只想到最简单的两层循环实现,留待后看,慢慢优化: 1 #include <iostream> 2 using namespace std; 3 int main() 4 { 5 int arr[6][6] = {0}; 6 7 for (int i = 0; i < 6; i++) 8 { 9 for (int j = 0; j < 6; j++) 10 { 11 if (i == 0 || i == 5) 12 { 13 arr[i][j] = 1; 14 } 15 else

【转】不分主副卡!全网通5.0时代到来

全网通在今天已经不是噱头了,它经历了有5年时间,从过去的全网通1.0到现在的全网通5.0,可以说有这长足的发展.今年,小米率先了支持全网通5.0的小米MIX 2S和红米Note5,可以双卡双待4G,一边打电话一边打游戏不掉线...下面机长就和机油们说说全网通的哪些事情?是时候搞懂1.0到5.0的差别. 2014年,中国电信提出了“全网通”,就是兼顾三大运营商网络,“一机在手,三网通用”的特性.但实际上,全网通1.0只能用电信卡做主卡,其他都只能做副卡.而且当主卡用4G的时候,其他的卡只能用2G网

K皇后问题递归解法

1 #include<iostream> 2 #include<cmath> 3 using namespace std; 4 5 bool check(int row,int *a) 6 { 7 for(int i=0;i<row;i++) 8 if (a[i]==a[row] || fabs(a[i]-a[row])==fabs(i-row)) 9 return false; 10 return true; 11 } 12 13 void show(int *a,int

浅谈C#中Control的Invoke与BeginInvoke在主副线程中的执行顺序和区别

今天无意中看到有关Invoke和BeginInvoke的一些资料,不太清楚它们之间的区别.所以花了点时间研究了下. 据msdn中介绍,它们最大的区别就是BeginInvoke属于异步执行的. Control.Invoke 方法 (Delegate) :在拥有此控件的基础窗口句柄的线程上执行指定的委托. Control.BeginInvoke 方法 (Delegate) :在创建控件的基础句柄所在线程上异步执行指定委托. msdn说明: 控件上的大多数方法只能从创建控件的线程调用. 如果已经创建控