SAHOVNICA

· · 题解

理解题意

这道题就是将一个大小为 r \times c 的由 X. 组成的交叉矩阵(自定义名称)的长变为原来的 a 倍,宽变为原来的 b 倍后输出。

交叉矩阵的定义:一个大小为 3 \times 5 的由 sb 组成的交叉矩阵如下:

sbsbs
bsbsb
sbsbs

(默认靠前的那个字符为矩阵的第一个字符!)

1

我们可以先把一个大小为 r \times c 的由 X. 组成的交叉矩阵构造出来(设矩阵为 x)。那么具体要怎么做呢?

我们可以发现:当 (i + j) \bmod 2 = 0 时,p_{i,j}X;否则,p_{i,j}.

所以,代码的其中一部分就出来啦!

for(i = 1; i <= r; i++){
        for(j = 1; j <= c; j++){
            x[i][j] = ((i + j) % 2? '.' : 'X');//用三目运算符判断当前位置上是哪个字符。 
        }
    }

2

那怎样得到最后的输出呢?

对比一下样例 1 中的交叉矩阵:

X.X.
.X.X

和最后的输出:

XX..XX..
XX..XX..
..XX..XX
..XX..XX

发现没?其中的 p_{i \times a + x,j \times b + y} 均等于 p_{i \times a,j \times b}x 为任意不大于 r 的正整数,y 为任意不大于 c 的正整数)!

那么如果 i = i + xj = j + y 时,原来的 ij 又等于什么呢?

i = (i - 1) \div a + 1 j = (j - 1) \div b + 1

没毛病吧?

for(i = 1; i <= r * a; i++){
        for(j = 1; j <= c * b; j++){
            cout<< x[(i - 1) / a + 1][(j - 1) / b + 1] ;//核心公式! 
        }
        cout<< endl;
    }

整道题就这么讲完啦!

3(坑)

不要输出空格!不要输出空格!绝对不要输出空格!!!

(不知道为什么,输出空格还能A两个点……)

AC code

#include<bits/stdc++.h>
using namespace std;
int r,c,a,b,i,j;
char x[15][15];
int main(){
    cin >> r >> c >> a >> b;
    for(i = 1; i <= r; i++){
        for(j = 1; j <= c; j++){
            x[i][j] = ((i + j) % 2? '.' : 'X');//用三目表达式判断当前位置上是哪个字符。 
        }
    }
    for(i = 1; i <= r * a; i++){
        for(j = 1; j <= c * b; j++){
            cout<< x[(i - 1) / a + 1][(j - 1) / b + 1] ;//核心公式! 
        }
        cout<< endl;
    }
    return 0;
}