列表

详情


WY70. 翻转翻转

描述

给定一个N*M的矩阵,在矩阵中每一块有一张牌,我们假定刚开始的时候所有牌的牌面向上。
现在对于每个块进行如下操作:
> 翻转某个块中的牌,并且与之相邻的其余八张牌也会被翻转。
XXX
XXX
XXX
如上矩阵所示,翻转中间那块时,这九块中的牌都会被翻转一次。
请输出在对矩阵中每一块进行如上操作以后,牌面向下的块的个数。

数据范围:

输入描述

输入的第一行为测试用例数t(1 <= t <= 100000),
接下来t行,每行包含两个整数N,M(0 <= N, M <= 1,000,000,000)

输出描述

对于每个用例输出包含一行,输出牌面向下的块的个数

示例1

输入:

5
1 1
1 2
3 1
4 1
2 2

输出:

1
0
1
2
0

原站题解

C 解法, 执行用时: 30ms, 内存消耗: 2072KB, 提交时间: 2021-08-01

#include<stdio.h>
int main()
{
    long long t,n,m,num,i;
    scanf("%lld",&t);
    //while(~scanf("%lld",&t))
    {
        for(i=0;i<t;i++)
      {
        scanf("%lld %lld",&n,&m);
        {
            if(n>=3&&m>=3)
            {
                num=(n-2)*(m-2);
            }
            else if(n==2||m==2)
            {
                num=0;
            }
            else if(n==1&&m>2)
            {
                num=m-2;
            }
            else if(n>2&&m==1)
            {
                num=n-2;
            }
            else if (m==1&&n==1)num=1;
            else num = (n-2)*(m-2);
        }
        printf("%lld\n",num);
      }
    }
    return 0;
}

C++ 解法, 执行用时: 30ms, 内存消耗: 2168KB, 提交时间: 2021-08-08

#include "bits/stdc++.h"
using namespace std;

int main()
{
    int t;
    cin >> t;
    while(t--)
    {
        long long N,M;
        scanf("%lld %lld",&N,&M);
        
        if(N == 1 && M == 1) printf("%lld\n",1);
        else if(N == 1 && M != 1) printf("%lld\n",M-2);
        else if(N != 1 && M == 1) printf("%lld\n",N-2);
        else printf("%lld\n",(M-2)*(N-2));
    }
    return 0;
}

上一题