洛谷P1548 棋盘问题C++题解-编程题目及题解论坛-编程-擎雷博客

洛谷P1548 棋盘问题C++题解

原题链接(洛谷):https://www.luogu.com.cn/problem/P1548

原题markdown:

# [NOIP1997 普及组] 棋盘问题

## 题目描述

设有一个$N \times M$方格的棋盘$(1≤N≤100,1≤M≤100)$

求出该棋盘中包含有多少个正方形、多少个长方形(不包括正方形)。

例如:当 $N=2, M=3$时:  ![](https://cdn.luogu.com.cn/upload/pic/310.png)

   
正方形的个数有$8$个:即边长为$1$的正方形有$6$个;

边长为$2$的正方形有$2$个。

长方形的个数有$10$个:

即  

$2 \times 1$的长方形有$4$个  ![](https://cdn.luogu.com.cn/upload/pic/311.png)

$1 \times 2$的长方形有$3$个: ![](https://cdn.luogu.com.cn/upload/pic/312.png)

$3 \times 1$的长方形有$2$个: ![](https://cdn.luogu.com.cn/upload/pic/313.png)

$3 \times 2$的长方形有$1$个: ![](https://cdn.luogu.com.cn/upload/pic/314.png)

如上例:输入:$2,3$

输出:$8,10$

## 输入格式

$N,M$

## 输出格式

正方形的个数与长方形的个数

## 样例 #1

### 样例输入 #1

```
2 3
```

### 样例输出 #1

```
8 10
```

## 提示

**【题目来源】**

NOIP 1997 普及组第一题

题解1(四层for循环):

#include<bits/stdc++.h>

using namespace std;
int m, n, cntZ, cntC;

int main() {
    cin >> n >> m;
    for (int i = 0; i <= n; i++)
        for (int j = 0; j <= m; j++)
            for (int k = i + 1; k <= n; k++)
                for (int l = j + 1; l <= m; l++) {
                    if (k - i == l - j) cntZ++;
                    else cntC++;
                }
    cout << cntZ << ' ' << cntC;
    return 0;
}

题解2(2层for循环)(非原创,由cyx编写):

#include <iostream>

using namespace std;
long long n, m, sum1 = 0, sum2 = 0, f;

int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            f = (n - i + 1) * (m - j + 1);
            if (i == j) {
                sum1 += f;
            } else {
                sum2 += f;
            }
        }
    }
    cout << sum1 << " " << sum2;
    return 0;
}
请登录后发表评论

    没有回复内容