洛谷 P12979 [GCJ 2022 Qualification] Punched Cards 题解

cbx2jun
10
2025-06-29

题目

洛谷题目传送门 【P12979】 [GCJ 2022 Qualification] Punched Cards

双倍经验

DMOJ题目传送门 【gcj22qra】 Google Code Jam '22 Qualification Round Problem A - Punched Cards(封面图就是从这来的)

太卡就用 Virtual Judge DMOJ-gcj22qra

正文

比较简单的一道题,按照题意模拟即可。

通过观察样例得到,每组数据输出时左上角都是 4 个点:

..+-+-+-+
..|.|.|.|
+-+-+-+-+
|.|.|.|.|
+-+-+-+-+
|.|.|.|.|
+-+-+-+-+

特判一下左上角的位置,再结合其他字符(|-.+)在“卡片”中应当存在的位置,用分支结构就可以了。

  • | 位于偶数行奇数列上;
  • + 位于奇数行奇数列上;
  • - 位于奇数行偶数列上;
  • . 位于偶数行偶数列上,以及左上角有 4 个。

循环应该循环到 2 \times R + 1(题目中明确说明的)以及 2 \times C + 1(观察可知,比如 C=4 时输出了 9 列)。

注意要输出 Case #x:

代码

/* By CB_X2_Jun */
#include <iostream>
using namespace std;
int t,r,c,z;
int main()
{
    cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);
    cin >> t;
    z=t;
    while(t--) // 多组数据
    {
        cin >> r >> c;
        cout << "Case #" << z-t << ":\n"; // 别忘了这个
        for(int i=1; i<=2*r+1; i++)
        {
            for(int j=1; j<=2*c+1; j++)
            {
                if(i==1&&j==1||i==1&&j==2||i==2&&j==1||i==2&&j==2)cout << "."; // 特判左上角
                else if(i%2==1&&j%2==1)cout << "+";
                else if(i%2==0&&j%2==1)cout << "|";
                else if(i%2==1&&j%2==0)cout << "-";
                else cout << "."; // 这里都按照位置的奇偶性做判断
            }
            cout << endl;
        }
    }
}

请勿 Copy + Paste,共创和谐洛谷!

动物装饰