分析总结一下所有有关打印题目的套路和思路:pat乙级:1109 擅长C, 1008元素循环右移,1050 螺旋矩阵,1027 打印沙漏等等

时间:2021-06-25 00:38:39

分析:

  1. 首先你要明白第一件事:所有要打印东西的题目打印都是从第一行到最后一行,从第一列到最后一列,你是没办法跳着打印的。可以看看其他几个打印题目1008元素循环右移,1050 螺旋矩阵1027 打印沙漏
  2. 观察要求打印的东西能否直接通过循环之间行列关系和要打印东西的个数和位置关系直接打印出来如:1027 打印沙漏,可以,元素循环右移可以。但是显然1050 螺旋矩阵1109 擅长C都不行,那我们该怎么办呢?有一种方法就是通过容器储存下来,打印没办法拐着弯来,那访问容器总行了把。
  3. 既然按照位置存好了那就一切好办了

来:先看题目

1109 擅长C

当你被面试官要求用 C 写一个“Hello World”时,有本事像下图显示的那样写一个出来吗?
分析总结一下所有有关打印题目的套路和思路:pat乙级:1109 擅长C, 1008元素循环右移,1050 螺旋矩阵,1027 打印沙漏等等
输入格式:
输入首先给出 26 个英文大写字母 A-Z,每个字母用一个 7×5 的、由 C 和 . 组成的矩阵构成。最后在一行中给出一个句子,以回车结束。句子是由若干个单词(每个包含不超过 10 个连续的大写英文字母)组成的,单词间以任何非大写英文字母分隔。题目保证至少给出一个单词。

输出格式:
对每个单词,将其每个字母用矩阵形式在一行中输出,字母间有一列空格分隔。单词的首尾不得有多余空格。相邻的两个单词间必须有一空行分隔。输出的首尾不得有多余空行。

点击查看代码
输入样例:
..C..
.C.C.
C...C
CCCCC
C...C
C...C
C...C
CCCC.
C...C
C...C
CCCC.
C...C
C...C
CCCC.
.CCC.
C...C
C....
C....
C....
C...C
.CCC.
CCCC.
C...C
C...C
C...C
C...C
C...C
CCCC.
CCCCC
C....
C....
CCCC.
C....
C....
CCCCC
CCCCC
C....
C....
CCCC.
C....
C....
C....
CCCC.
C...C
C....
C.CCC
C...C
C...C
CCCC.
C...C
C...C
C...C
CCCCC
C...C
C...C
C...C
CCCCC
..C..
..C..
..C..
..C..
..C..
CCCCC
CCCCC
....C
....C
....C
....C
C...C
.CCC.
C...C
C..C.
C.C..
CC...
C.C..
C..C.
C...C
C....
C....
C....
C....
C....
C....
CCCCC
C...C
C...C
CC.CC
C.C.C
C...C
C...C
C...C
C...C
C...C
CC..C
C.C.C
C..CC
C...C
C...C
.CCC.
C...C
C...C
C...C
C...C
C...C
.CCC.
CCCC.
C...C
C...C
CCCC.
C....
C....
C....
.CCC.
C...C
C...C
C...C
C.C.C
C..CC
.CCC.
CCCC.
C...C
CCCC.
CC...
C.C..
C..C.
C...C
.CCC.
C...C
C....
.CCC.
....C
C...C
.CCC.
CCCCC
..C..
..C..
..C..
..C..
..C..
..C..
C...C
C...C
C...C
C...C
C...C
C...C
.CCC.
C...C
C...C
C...C
C...C
C...C
.C.C.
..C..
C...C
C...C
C...C
C.C.C
CC.CC
C...C
C...C
C...C
C...C
.C.C.
..C..
.C.C.
C...C
C...C
C...C
C...C
.C.C.
..C..
..C..
..C..
..C..
CCCCC
....C
...C.
..C..
.C...
C....
CCCCC
HELLO~WORLD!

输出样例:

点击查看代码
C...C CCCCC C.... C.... .CCC.
C...C C.... C.... C.... C...C
C...C C.... C.... C.... C...C
CCCCC CCCC. C.... C.... C...C
C...C C.... C.... C.... C...C
C...C C.... C.... C.... C...C
C...C CCCCC CCCCC CCCCC .CCC.

C...C .CCC. CCCC. C.... CCCC.
C...C C...C C...C C.... C...C
C...C C...C CCCC. C.... C...C
C.C.C C...C CC... C.... C...C
CC.CC C...C C.C.. C.... C...C
C...C C...C C..C. C.... C...C
C...C .CCC. C...C CCCCC CCCC.

我的代码:

#include<bits/stdc++.h>
using namespace std;
void print(string a,string b[]){
    for(int i=0;i<7;i++){
        for(int j=0;j<a.size();j++){
            if(j<a.size()-1)
                cout<<b[a[j]-'A'].substr(i*6,6);
            else
                cout<<b[a[j]-'A'].substr(i*6,5);
        }
        cout<<endl;
    }
}
int main(){
    string a[26];
    for(int i=0;i<26;i++){
        char c[43];
        int k=0;
        while(k<42){
            scanf("%c",&c[k]);
            if(c[k]=='\n')c[k]=' ';
            k++;
        }
        c[42]='\0';
        a[i]=c;
    }
    //cout<<a[1];
    string b;getline(cin,b);
    vector<string>vvv;
    int late=0,tag=0;
    for(int i=0;i<b.size();i++){
        if((b[i]>'Z'||b[i]<'A')){
            if(tag){
                vvv.push_back(b.substr(late,i-late));late=i+1;tag=0;
            }
            else
                late=i+1;
        }
        else{
            tag=1;
        } 
    }
    if(late<b.size())vvv.push_back(b.substr(late));//注意后面的没有结束符号如HELLO~WORLD  AAA
    for(int kkk=0;kkk<vvv.size();kkk++){
        print(vvv[kkk],a);
        if(kkk<vvv.size()-1)cout<<endl;
    }
    return 0;
}

1050 螺旋矩阵

本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为 m 行 n 列,满足条件:m×n 等于 N;m≥n;且 m−n 取所有可能值中的最小值。
输入格式:
输入在第 1 行中给出一个正整数 N,第 2 行给出 N 个待填充的正整数。所有数字不超过 10^4,相邻数字以空格分隔。

输出格式:
输出螺旋矩阵。每行 n 个数字,共 m 行。相邻数字以 1 个空格分隔,行末不得有多余空格。

输入样例:
12
37 76 20 98 76 42 53 95 60 81 58 93
输出样例:
98 95 93
42 37 81
53 20 76
58 60 76

我的代码

#include<bits/stdc++.h>
using namespace std;
bool compa(int a,int b){
    return a>b;}
int c[10000][105]={0};
int main (){
    int n;cin>>n;
    int a[10001];
    for(int i=0;i<n;i++){scanf("%d",&a[i]);}
    sort(a,a+n,compa);
    int n2,m1;
    for(n2=sqrt((double)n);n2>=1;n2--)
	{
		if(n%n2==0)
		{
			m1=n/n2;
			break;
		}
	}
    int cnt=0;
    for(int i=0;;i++){
        for(int j=i;j<n2&&c[i][j]==0&&cnt<n;j++){
            c[i][j]=a[cnt++];
        }
        for(int j=i+1;j<m1&&c[j][n2-i-1]==0&&cnt<n;j++){
            c[j][n2-i-1]=a[cnt++];
        }
        for(int j=n2-i-2;j>=0&&c[m1-1-i][j]==0&&cnt<n;j--){
            c[m1-1-i][j]=a[cnt++];
        }
        for(int j=m1-i-2;j>=0&&c[j][i]==0&&cnt<n;j--){
            c[j][i]=a[cnt++];
        }
        if(cnt==n)break;
    }
    for(int i = 0;i<m1;i++){
        for(int j=0;j<n2;j++){
            printf("%d",c[i][j]);
            if(j<n2-1)printf(" ");
        }
        printf("\n");
    }
    
    return 0;
}

待会闲下来再更新分析