【深入浅出程序设计竞赛】:蛇形方阵、杨辉三角、压缩技术

183 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 31 天,点击查看活动详情

【深基5.习6】蛇形方阵

题目描述

给出一个不大于 99 的正整数 nn,输出 n×nn\times n 的蛇形方阵。

从左上角填上 11 开始,顺时针方向依次填入数字,如同样例所示。注意每个数字有都会占用 33 个字符,前面使用空格补齐。

输入格式

输入一个正整数 nn,含义如题所述。

输出格式

输出符合题目要求的蛇形矩阵。

样例 #1

样例输入 #1

4

样例输出 #1

1  2  3  4
 12 13 14  5
 11 16 15  6
 10  9  8  7

提示

数据保证,1n91 \leq n \leq 9

#include<bits/stdc++.h>
using namespace std;
//记录输出的数组
int a[15][15];
//改变位置的数组
int pos[4][2]={0,1,1,0,0,-1,-1,0};
int main(){
    int n;
    cin >> n;
    int x = 1, y = 1;	        // 当前位置 
    int d = 0;			// d 记录头朝向 
    for(int i=1; i<=n*n; i++){
        // a 用于记录输出 
        a[x][y] = i;
        // tx和 ty用于检查是否需要转向(是否需要修改 d) 
        int tx = x + pos[d][0];
        int ty = y + pos[d][1];
        // 如果越界或以前填过,则修改 d 
        if(tx<1 || tx>n || ty<1 || ty>n || a[tx][ty]) d=(d+1)%4;
        // 当处理完 d 后,就正式修改 x和y了 
        x += pos[d][0];
        y += pos[d][1];
    }
	
    // 输出 
    for(int i = 1; i<=n; i++) {
        for(int j = 1; j<=n; j++) {
            printf("%3d", a[i][j]);
        }
        cout << endl;
    } 

    return 0;
}

【深基5.习7】杨辉三角

题目描述

给出 n(n20)n(n\le20),输出杨辉三角的前 nn 行。

如果你不知道什么是杨辉三角,可以观察样例找找规律。

样例 #1

样例输入 #1

6

样例输出 #1

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1

代码

#include<bits/stdc++.h>
using namespace std;
int a[21][21];
int main() {
    int n;
    cin >> n;
    for(int i = 1; i<=n; i++) {
        a[i][1] = a[i][i] = 1;
    }
	
    for(int i = 1; i<=n; i++) {
        for(int j = 2; j<i; j++) {
            a[i][j] = a[i-1][j] + a[i-1][j-1];
        }
    }
	
    for(int i = 1; i<=n; i++) {
        for(int j = 1; j<=i; j++) {
            cout << a[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
} 

压缩技术

题目描述

设某汉字由 N×NN \times N0\texttt 01\texttt 1 的点阵图案组成。

我们依照以下规则生成压缩码。连续一组数值:从汉字点阵图案的第一行第一个符号开始计算,按书写顺序从左到右,由上至下。第一个数表示连续有几个 0\texttt 0,第二个数表示接下来连续有几个 1\texttt 1,第三个数再接下来连续有几个 0\texttt 0,第四个数接着连续几个 1\texttt 1,以此类推……

例如: 以下汉字点阵图案:

0001000
0001000
0001111
0001000
0001000
0001000
1111111

对应的压缩码是: 7 3 1 6 1 6 4 3 1 6 1 6 1 3 7\texttt {7 3 1 6 1 6 4 3 1 6 1 6 1 3 7} (第一个数是 NN ,其余各位表示交替表示0和1 的个数,压缩码保证 N×N=N \times N= 交替的各位数之和)

输入格式

数据输入一行,由空格隔开的若干个整数,表示压缩码。

输出格式

表示最后的汉字点阵图(点阵符号之间不留空格)。

样例 #1

样例输入 #1

7 3 1 6 1 6 4 3 1 6 1 6 1 3 7

样例输出 #1

0001000
0001000
0001111
0001000
0001000
0001000
1111111

提示

数据保证,3N2003\leq N\leq 200

代码

#include<bits/stdc++.h>
using namespace std;
int t = 0;      // 判断有没有回车
bool flag = 1;	// 判断输出什么
int s = 0;      // 判断有没有输完
int main(){
    int n; 
    cin >> n;
    int val;
    while(s < n*n) {
        flag = !flag;
        cin >> val;
        for(int b = val; b >= 1; b--) {
            // 首先判断是否需要回车,回车后t要清零
            if(t == n) {
                cout << "\n";
                t = 0;
            }
            cout << flag;
            t++;
            s++;
        }
    }
    return 0;
}