【GESP2509四级】排兵布阵

GESP2509四级排兵布阵解析

4143:【GESP2509四级】排兵布阵


时间限制: 1000 ms         内存限制: 65536 KB
提交数:538    通过数: 273

【题目描述】

作为将军,你⾃然需要合理地排兵布阵。地图可以视为n⾏m列的⽹格,适合排兵的⽹格以 1 标注,不适合排兵的⽹格以0标注。现在你需要在地图上选择⼀个矩形区域排兵,这个矩形区域内不能包含不适合排兵的⽹格。请问可选择的矩形区域最多能包含多少⽹格?

【输入】

第⼀⾏,两个正整数n,m ,分别表⽰地图⽹格的⾏数与列数。

接下来n⾏,每⾏m个整数ai,1,ai,2,...,ai,m ,表⽰各⾏中的⽹格是否适合排兵。

【输出】

⼀⾏,⼀个整数,表⽰适合排兵的矩形区域包含的最⼤⽹格数。

【输入样例】

4 3
0 1 1
1 0 1
0 1 1
1 1 1

【输出样例】

4

【提示】

输入样例 2:

3 5
1 0 1 0 1
0 1 0 1 0
0 1 1 1 0

输出样例 2:

3

先要明白什么是矩形,1行是矩形,1列也是矩形,构成一个正方形的也是矩形,所以这道题就是找出里面的矩形,可以通过枚举来做,先查行,再查列,再查矩形,

4 3
0 1 1
1 0 1
0 1 1
1 1 1

上面的是输入

下面的是查的时候的顺序,怎么查的,没有粘贴完,要看所有的可以自己在后面的代码改

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

所以这个题目的难点就来了,你怎么写代码根据这些顺序来查,一两个for循环肯定是不行的,所以这道题的难点就是for循环

#include <algorithm>
#include <cstdio>
#include <iostream>
using namespace std;

const int N = 15;
int n, m;
int g[N][N];
int ans;

int main() {
    scanf("%d%d", &n, &m);

    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            scanf("%d", &g[i][j]);
    int maxarea = 0;
    for (int x1 = 1; x1 <= n; x1++)
        for (int y1 = 1; y1 <= m; y1++)
            for (int x2 = x1; x2 <= n; x2++) {
                for (int y2 = y1; y2 <= m; y2++) {
                    bool v = 1;
                   for(int i = x1; i <= x2; i++){
                    for(int j = y1; j <= y2; j++){
                        if(g[i][j]==0) v = 0;
                    }
                   }
                   cout<<endl;
                   if(v){
                    int area = (x2-x1+1)*(y2-y1+1);
                    maxarea = max(maxarea,area);
                   }
                }
            }

    printf("%d\n", maxarea);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值