九度Online Judge 题目1432:叠筐 解答
提交网址: http://ac.jobdu.com/problem.php?pid=1432
内存限制:128 兆 时间限制:1 秒
题目描述:
把一个个大小差一圈的筐叠上去,使得从上往下看时,边筐花色交错。这个工作现在要让计算机来完成,得看你的了。
输入:
输入是一个个的三元组,分别是,外筐尺寸n(n为满足0<n<80的奇整数),中心花色字符,外筐花色字符,后二者都为ASCII可见字符;
输出:
输出叠在一起的筐图案,中心花色与外筐花色字符从内层起交错相叠,多筐相叠时,最外筐的角总是被打磨掉。叠筐与叠筐之间应有一行间隔。
样例输入:11 B A5 @ W 样例输出:
AAAAAAAAA ABBBBBBBBBA ABAAAAAAABA ABABBBBBABA ABABAAABABA ABABABABABA ABABAAABABA ABABBBBBABA ABAAAAAAABA ABBBBBBBBBA AAAAAAAAA
@@@ @WWW@ @W@W@ @WWW@ @@@
分析:
这是排版题中的一种类型(无明显规律),它所要求的图形不具有显著的规律性或者规律性较难直接应用到输出当中。为了解决此类问题,可以采取一种方法:先完成排版,再进行输出。
具体步骤:
1. 使用一个二维数组,从内向外一层层地填充字符(先完成1/4,然后使用竖直方向对称和对角线对称填充其他地方);
2. 去掉4个角(尺寸n=1时不处理).
AC代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int main()
{
int n,k,i,j;
char in_char,out_char;
while(cin>>n>>in_char>>out_char && ((n>0 && n<80) && n%2!=0) ) // 避免了 短路与 的歧义性
{
char s[n+1][n+1];
memset(s,'0',sizeof s);
char fill_char;
int flag=0; // flag用来记录框数的奇偶
for(k=(n+1)/2;k>=1;--k)
{
flag++;
if(flag%2==1) fill_char=in_char;
else if(flag%2==0) fill_char=out_char;
for(i=k;i<=n+1-k;i++)
{
s[k][i]=fill_char;
s[i][k]=fill_char; // 与第一句的游标走向关于对角线对称
s[i][n+1-k]=fill_char; // 与第一句的游标走向关于竖直方向对称
s[n+1-k][i]=fill_char; // 与第一句的游标走向关于水平方向对称
}
}
if(n!=1)
{
s[1][1]=' ';
s[n][1]=' ';
s[1][n]=' ';
s[n][n]=' ';
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cout<<s[i][j];
}
cout<<endl;
}
cout<<endl;
}
return 0;
}
/**************************************************************
Problem: 1432 Language: C++ Result: Accepted Time:10 ms Memory:1520 kb ****************************************************************/