叠筐算法分析

前言:
常见于机试题里的图形表示题,能很好考察我们的逻辑分析和编程基础能力。这道题我见于《王道机试》第二版,仔细理解后,与大家分享下思路,末尾总结规律。

  1. 题目描述:把一个个大小差一圈的筐叠上去,使得从上往下看时,边筐花色交错。这个工作现在要让计算机来完成,得看你的了。

  2. 输入:输入是一个个三元组,分别是:外筐尺寸n (n为满足0<n< 80的奇整数),中心花色字符,外筐花色字符,后二者都为ASCII可见字符。

  3. 输出:输出叠在一起的筐图案, 中心花色与外筐花色字符从内层起交错相叠,多筐相叠时,最外筐的角总是被打磨掉。叠筐与叠筐之间应有一行间隔。

  4. 样例:

    在这里插入图片描述
    分析:图形表示题解题首先要找到规律。题目文字比较拗口,我们直接从样例观察,需要时再去回顾题目。样例所给的n比较大,我们不妨从n=1,n=3开始观察规律。
    在这里插入图片描述

  • 结合样例,观察到从另一个花色包围中心字符开始,每一圈花色交替,但是最外圈的四个角看着非常扎眼,这也说明我们在写算法时很难越过这四个角。
  • 缺什么补什么,我们不妨先将四个角补上,将规律变为规整的易于表示的,在最后想办法去掉四个角。这样图形规律是不是更一目了然,只是简单的每圈花色交替。
  • 要用代码表示这个类似矩阵的图形,且末尾想要实现删除四个角,我们应该能想到一个非常合适的媒介——二维数组,将四个角的数组元素替换为空格即可实现删除。接下来直接用代码表示这个规律。
#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;
}

总结:数组可以存储数组元素,易于修改也易于输出。我们要利用好数组的特性去处理这些图形表示题目。图形表示解题关键在于抓住规律,然后用合适的算法和数据结构去表达出这个规律。对于不显眼或不好处理的规律,我们优先考虑将规律优化规整,即缺什么补什么,便于用编程语言去实现不规则图形。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值