题解 P6321 【[COCI2006-2007#4] SKENER】

· · 题解

这次我要来一波完整丰富的分析。

题意

首先,输入四个数;前两个是报纸的行数、列数,后两个是放大镜的两个“参数”(具体后面会讲)。

让后,按行数 r、列数 c 输入一个字符矩阵。

这里我们就要想到:用二维数组

让后,我们要按题目要求,把每一个小字符“放大”。

那这里什么叫放大呢?

题目解释: 把每个字符都转换成一个 zr 行 zc 列的矩阵。

实际上就是:把原来的每一个字符复制zr行、复制zc列!

但单个字符作矩阵输出是不现实的(程序按行输出)。

所以我们想到:用四重循环!

so……

for(int i=1;i<=r;i++)
    for(int j=1;j<=c;j++)
        for(int m=1;m<=zr;m++)
            for(int l=1;l<=zc;l++)
            putchar(a[m][l]);

这就对了吗???

错!

这种写法过于想当然。 Dev:你第一次不是这样写的?

我们要输出的,是由原来的字符组成的许多矩阵。

其中的m、l只是用于控制放大行数、列数的,不能用作输出字符!

输出工作应交给其中的i,j 。

如果你上面都懂了,那这道题也差不多A了。

注意!四重循环尤其小心!增量不要搞混!

为此我调了数次,输出来什么都不知道

code:

#include<bits/stdc++.h>
using namespace std;
char a[55][55];
int main () {
    int r,c,zr,zc;//老老实实按题目定义 
    cin>>r>>c>>zr>>zc;//r:原行数 c:原列数 zr:放大行数 zc放大列数 
    for(int i=1;i<=r;++i){
        for(int j=1;j<=c;++j){
            cin>>a[i][j];
        }
    }//常规二维数组输入
    for(int i=1;i<=r;i++){//四重循环 
        //这里控制原行数 
        for(int m=1;m<=zr;m++){
            //枚举放大后的行数 
            for(int j=1;j<=c;j++){
                //这里控制原列数 
                for(int l=1;l<=zc;l++)//枚举放大后的列数 
                    putchar(a[i][j]);//输出 (快捷) 
            }   
            printf("\n");//换行位置很重要 (在这一行所有列的字符输完 后再换行) 
        }
    }       
    return 0;
}