前言:常见于机试题里的图形表示题,能很好考察我们的逻辑分析和编程基础能力。这道题我见于《王道机试》第二版,仔细理解后,与大家分享下思路,末尾总结规律。
- 题目描述:把一个个大小差一圈的筐叠上去,使得从上往下看时,边筐花色交错。这个工作现在要让计算机来完成,得看你的了。
- 输入:输入是一个个三元组,分别是:外筐尺寸n (n为满足0<n< 80的奇整数),中心花色字符,外筐花色字符,后二者都为ASCII可见字符。
- 输出:输出叠在一起的筐图案, 中心花色与外筐花色字符从内层起交错相叠,多筐相叠时,最外筐的角总是被打磨掉。叠筐与叠筐之间应有一行间隔。
- 样例
image.png
分析:图形表示题解题首先要找到规律。题目文字比较拗口,我们直接从样例观察,需要时再去回顾题目。样例所给的n比较大,我们不妨从n=1,n=3开始观察规律。
image.png - 结合样例,观察到从另一个花色包围中心字符开始,每一圈花色交替,但是最外圈的四个角看着非常扎眼,这也说明我们在写算法时很难越过这四个角。
- 缺什么补什么,我们不妨先将四个角补上,将规律变为规整的易于表示的,在最后想办法去掉四个角。这样图形规律是不是更一目了然,只是简单的每圈花色交替。
- 要用代码表示这个类似矩阵的图形,且末尾想要实现删除四个角,我们应该能想到一个非常合适的媒介——二维数组,将四个角的数组元素替换为空格即可实现删除。
接下来直接用代码表示这个规律。
#include <stdio.h>
#include <iostream>
using namespace std;
char matrix[80][80]; //定义二维数组
int main(){
int n; //叠筐的边长
char a,b; //定义输入字符a,b类型
int gap=0; //添加每个输入用例之间的间隔
while(scanf("%d %c %c",&n,&a,&b)!=EOF){ //允许多例输入
if(gap==0)
gap=1;
else
printf("\n");
int i,j;
int length; //length是当前圈的边长
for(i=0;i<=n/2;i++){ //i是当前圈左上角的下标,n/2+1是图形总圈数
length = n-2*i; //当前圈边长是总边长减去外圈的两侧
j = n-i-1; //j是当前圈右下角的下标
char c;
if((n/2-i)%2==0) //判断当前圈花色
c=a;
else
c=b;
int k;
for(k=0;k<length;k++){ //遍历对当前圈二维数组元素赋值
matrix[i][i+k] = c; //对当前圈上侧赋值
matrix[i+k][i] = c; //对当前圈左侧赋值
matrix[j][j-k] = c; //对当前圈右侧赋值
matrix[j-k][j] = c; //对当前圈下侧赋值
}
}
if(n!=1){ //去掉四个角
matrix[0][0] = ' '; //注意这里要用单引号
matrix[0][n-1] = ' ';
matrix[n-1][0] = ' ';
matrix[n-1][n-1] = ' ';
}
for(i=0;i<n;i++){ //从二维数组遍历输出图形
for(j=0;j<n;j++){
printf("%c",matrix[i][j]);
}
printf("\n");
}
}
return 0;
}
总结:数组可以存储数组元素,易于修改也易于输出。我们要利用好数组的特性去处理这些图形表示题目。
图形表示解题关键在于抓住规律,然后用合适的算法和数据结构去表达出这个规律。对于不显眼或不好处理的规律,我们优先考虑将规律优化规整,即缺什么补什么,便于用编程语言去实现不规则图形。
网友评论