例2.8 叠筐- 九度教程第15题

题目:

时间限制:1 秒 内存限制:128 兆 特殊判题:否
题目描述:
把一个个大小差一圈的筐叠上去,使得从上往下看时,边筐花色交错。这个工作现在要让计算机来完成,得看你的了。
输入:
输入是一个个的三元组,分别是,外筐尺寸n(n为满足0<n<80的奇整数),中心花色字符,外筐花色字符,后二者都为ASCII可见字符;
输出:
输出叠在一起的筐图案,中心花色与外筐花色字符从内层起交错相叠,多筐相叠时,最外筐的角总是被打磨掉。叠筐与叠筐之间应有一行间隔。
样例输入:
11 B A
5 @ W
样例输出:

解析:

如此例所示,其输出图形的规律性主要体现在由内而外的各个环上,而这与输出顺序又不太契合(从上至下,从左至右),不容易将该图形存在的规律直接应用到输出当中,所以需要使用刚才所提到的办法——先排版后输出。先用一个二维数组保存将要输出的字符阵列,并在该数组上首先完成排版。因为没有了输出时从上至下、从左至右的顺序限制,能更加随意的按照自己的需要或者图形的规律来依次输出图形,从而完成题目要求。

利用一个缓存数组来表示将要输出的字符阵列,规定阵列左上角字符坐标为(1,1),阵列右下角字符坐标为(n,n),其它坐标可由此推得。程序按照由最内圈至最外圈的的顺序来完成图形的排列。
完成每圈排列时都需要注意两个要点:

(1)首先,需要确定该圈左上角的坐标。将以这个坐标为参照点来完成该圈的其它字符位置的确定(当然也可以选用其它点)。观察图形得知,最中间圈的左上角字符坐标为(n / 2 + 1,n / 2 + 1)次中间圈的左上角字符坐标为(n / 2 + 1- 1,n / 2 + 1 - 1),依次类推即可得到图形中每一个圈的参照点。
(2)其次,需要计算该圈每边边长长度。这也较容易得出,中心圈长度为1,次中心圈长度为3,依次类推,外圈总比内圈长度增加2。

大致思路:

用一个二维数组保存将要输出的字符阵列在该数组上完成排版,然后输出。具体排版方法按如下思路进行:

首先,明确该圈使用哪一个字符来填充,使用判断循环次数指示变量j的奇偶性来判断当前需要使用的字符,即奇数次循环时(j为奇数)时使用第一个字符,偶数次循环时使用第二个字符。
        然后,确定该圈左上角字符的坐标,使用中心坐标(n / 2 + 1,n / 2 + 1)减去当前循环次数指示变量j来确定该圈左上角坐标,即(n / 2 + 1- j,n / 2 + 1 - j)。
        接着,计算该圈边长长度,利用初始值为1的循环指示变量i来表示边长长度,并在每次循环结束后加2,代表边长由1开始,每外移一个圈边长长度即加上2。利用变量i所存的值即可对当前圈的四条边进行赋值,对应的坐标已在代码中给出,这里不再列举。

在完成所有圈的编排后,只需按照题目的需要去除四个角的字符,最后将整个输出缓存中的字符阵列输出即可。

注:

1,while(scanf("%d %c %c",&n,&a,&b)==3) //!!!注意此处格式串中必须含有空格

2, if(n!=1)    //注意当n不为1时,不需要此步骤
        {               //边界数据处理(n==1为边界数据,当n为1时,不需要将四角字符修改成空格)
            outPutBuf[1][1]=' ';  //!!!注意此处是单引号-字符,不是双引号-字符串
            outPutBuf[1][n]=' ';
            outPutBuf[n][1]=' ';
            outPutBuf[n][n]=' '; //将四角置为空格
        }

3,排版题另一种解决思路:当输出图形具有的规律不能或者很难直接应用到输出上时,就应该考虑此例采用的方法—先排版后输出

代码:

#include<stdio.h>
int main()
{int outPutBuf[82][82]; //用于预排版的输出缓存char a,b;              //输出的两个字符int n;                 //叠筐大小bool firstCase=true;  //是否为第一组数据标志,初始值为truewhile(scanf("%d %c %c",&n,&a,&b)==3) //!!!注意此处格式串中必须含有空格{if(firstCase==true){//若是第一组数据firstCase=false;//将第一组数据标志标记成false}else{printf("\n");   //否则输出换行}for(int i=1,j=1;i<=n;i+=2,j++)//从里之外输出每个圈{int x=n/2+1,y=x; //最中间圈的左上角字符坐标x-=j-1;y-=j-1;   //计算每个圈左上角的坐标char c=j%2==1?a:b;//计算当前圈需要使用哪个字符(奇数圈用a,偶数圈用b)for(int k=1;k<=i;k++) //对当前圈进行赋值{outPutBuf[x+k-1][y]=c; //上方outPutBuf[x][y+k-1]=c; //左方outPutBuf[x+i-1][y+k-1]=c; //右方(x坐标不变)outPutBuf[x+k-1][y+i-1]=c; //下方(y坐标不变)}}if(n!=1)        //注意当n不为1时,不需要此步骤{outPutBuf[1][1]=' ';  //!!!注意此处是单引号-字符,不是双引号-字符串outPutBuf[1][n]=' ';outPutBuf[n][1]=' ';outPutBuf[n][n]=' '; //将四角置为空格}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){printf("%c",outPutBuf[i][j]);}printf("\n");}}return 0;
}

下面是一个测试例子,WOW!

例2.8 叠筐 - 九度教程第15题(排版题)相关推荐

  1. Piggy-Bank - 九度教程第 102 题

    Piggy-Bank - 九度教程第 102 题 题目 时间限制:1 秒 内存限制:32 兆 特殊判题:否 题目描述: Before ACM can do anything, a budget mus ...

  2. 质因数的个数 - 九度教程第54题

    质因数的个数 - 九度教程第54题 题目 时间限制:1 秒 内存限制:32 兆 特殊判题:否 题目描述: 求正整数 N(N>1)的质因数的个数. 相同的质因数需要重复计算.如 120=22235 ...

  3. 不容易系列之一(九度教程第 94 题)

    不容易系列之一(九度教程第 94 题) 时间限制:1 秒 内存限制:128 兆 特殊判题:否 1.题目描述: 大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了!做好"一件&q ...

  4. 成绩排序 九度教程c语言,九度OJ 1089 数字反转

    题目分析: 使用队列存放每一位的数字,然后输出并计算得到反转数值,从而实现数字反转. 源代码: [cpp] #include #include using namespace std; int mai ...

  5. Excel排序 九度教程第4题

    题目链接 题目描述: Excel可以对一组纪录按任意指定列排序.现请你编写程序实现类似功能. 对每个测试用例,首先输出1行"Case i:",其中 i 是测试用例的编号(从1开始) ...

  6. 数制转换 九度教程第44题 a进制数转换为b进制数 不同进制之间相互转换

    题目链接 解题思路: 1.将a进制数转换成十进制数: 2.将十进制数转换成b进制数: 3.使用do while 循环,可以确保即使被转换数字是 0 ,程序也能正常工作. AC代码: #include& ...

  7. 动态规划 背包问题小结 0-1背包(采药 九度第101题) 完全背包(Piggy-Bank POJ 1384) 多重背包(珍惜现在,感恩生活 九度第103题)

    本小结介绍0-1背包.完全背包以及多重背包问题 记忆要点: 0-1背包:二维数组情况下,顺序遍历体积或者倒序均可以                降维情况下需倒序遍历体积 完全背包:数组降维+顺序遍历 ...

  8. 非常可乐(杭州电子科技大学第四届大学生程序设计竞赛)(九度2013年教程87题)

    题目描述:大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多 ...

  9. 剑指Offer - 九度1511 - 从尾到头打印链表

    剑指Offer - 九度1511 - 从尾到头打印链表2013-11-29 21:08 题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 输入: 每个输入文件仅包含一组测试样例. 每一组测试案 ...

  10. 剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列

    剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列2013-11-23 03:16 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出 ...

最新文章

  1. 一个软件公司需要多少前端_制作一个小程序商城需要多少钱?开发小程序公司哪家强?...
  2. vue项目中app.vue 、main.js和 index.html的关联
  3. mybatisplus自动生成id_mybatisPlus自动代码生成实例(超级简单使用)
  4. 被程序员忽视的位运算
  5. 理解Android Java垃圾回收机制
  6. linux deepin sudo: add-apt-repository:找不到命令 解决办法
  7. 直播 | AMP:针对模型参数施加对抗扰动的高效神经网络正则化算法
  8. 带通滤波器作用和用途_带通滤波器作用
  9. python处理滑块验证码_使用python实现滑动验证码
  10. oracle日期修改格式化,oracle日期格式化的实现
  11. rxjs处理http请求超时
  12. cicd持续集成全程_CICD-持续集成amp;持续交付
  13. Juniper Networks 修复开源操作系统 Junos OS 等中的多个严重漏洞
  14. eclipse下没有build project的解决方法
  15. 高德地图如何取消订单_一文教你如何爬取高德地图
  16. 22.支持向量机—高斯核函数
  17. 【毕设狗】【单片机毕业设计】基于单片机的交通红绿灯控制系统的设计
  18. Windows下linux传盘工具,Windows下安装红旗Linux及工具盘全过程
  19. gdb学习20:总结
  20. 爬虫---实现英语翻译(有道翻译)

热门文章

  1. Linux网站搭建(3)---内网网站发布到外网(转)
  2. 早上运动和晚上运动,哪个更利于减肥?
  3. 决策树算法与应用 学习笔记
  4. 眼动追踪技术 Eye tracking总结
  5. unity 1 学习 物体旋转和通过脚本调用单击事件函数,find函数找物体的方法
  6. Atiitt 提升复用性之道 项目成本之道 Atitit 代码复用的理解attilax总结 1. 复用分类 1 1.1. 类库侧重代码重用,框架侧重设计重用 2 2. 文档与索引体系 2 3
  7. Atitti  css   transition Animation differ区别
  8. Atitit.struts2体系结构大总结
  9. 亚马逊:贝佐斯没有闹钟
  10. 精细运营,这只“蚂蚁”开辟了一条全新的财富之路