小猴编程C++ | 小猴的棋局

学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!

附上汇总贴:小猴编程C++ | 汇总-CSDN博客


【题目描述】

小猴和朋友正在玩一个游戏,初始时,在一个 n×m 的棋盘上放置着 n×m 个棋子,每枚棋子都有一定的价值,第 i(1≤in) 行第 j(1≤jm) 列的棋子的价值为 vi,j

该游戏的规则为:在棋盘中任意选取两个正方形区域(第 k(1≤k≤2) 个正方形的左上角格子在第 xk 行第 yk 列,边长为 lenk),要求双方玩家使用最短的时间计算出这两个正方形区域中的总价值,谁先计算出正确结果,本局游戏就是谁获胜。

现在小猴想要知道,在他制定的规则下,游戏一共进行 q 局,每局游戏的正确结果是多少,以便于用来核对双方玩家计算出的结果是否正确。

【输入】

第一行,包含两个整数 n,m

接下来 n 行,每行包含 m 个整数 vi,1,vi,2,…,vi,m

接下来一行,包含一个整数 q

接下来 q 行,每行包含 6 个整数 x1,y1,len1,x2,y2,len2。

【输出】

共 t 行,每行一个整数,表示答案。

【输入样例】

2 2
1 2
3 4
3
1 1 1 2 2 1
1 2 1 2 1 1
2 1 1 2 2 1

【输出样例】

5
5
7

【代码详解】

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 810, M = 810;
int n, m, q;
LL s[N][M];
int main()
{
    cin >> n >> m;
    for (int i=1; i<=n; i++) {
        for (int j=1; j<=m; j++) {
            cin >> s[i][j];
            s[i][j] += s[i][j-1];
        }
    }
    cin >> q;
    while (q--)
    {
        int x1, y1, len1, x2, y2, len2;
        cin >> x1 >> y1 >> len1 >> x2 >> y2 >> len2;
        int x3 = x1 + len1 - 1, y3 = y1 + len1 - 1;
        int x4 = x2 + len2 - 1, y4 = y2 + len2 - 1;
        LL res = 0;
        for (int i=x1; i<=x3; i++) {
            res += s[i][y3] - s[i][y1-1];
        }
        for (int i=x2; i<=x4; i++) {
            res += s[i][y4] - s[i][y2-1];
        }
        if (!(x3<x2 || x4<x1 || y3<y2 || y4<y1)) {
            int x[] = {x1, x2, x3, x4};
            int y[] = {y1, y2, y3, y4};
            sort(x, x+4);
            sort(y, y+4);
            for (int i=x[1]; i<=x[2]; i++) {
                res -= s[i][y[2]] - s[i][y[1]-1];
            }
        }
        cout << res << endl;
    }
    return 0;
}

【运行结果】

3 4
1 2 3 4
-1 -2 -3 -4
6 7 -6 -7
3
1 1 2 2 3 2
-20
1 1 3 2 2 1
7
1 1 2 2 2 2
-2

猜你喜欢

转载自blog.csdn.net/guolianggsta/article/details/133895969