原题链接:叠筐
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 24806 Accepted Submission(s): 6541 Problem Description 需要的时候,就把一个个大小差一圈的筐叠上去,使得从上往下看时,边筐花色交错。这个工作现在要让计算机来完成,得看你的了。
Input 输入是一个个的三元组,分别是,外筐尺寸n(n为满足0<n<80的奇整数),中心花色字符,外筐花色字符,后二者都为ASCII可见字符; Output 输出叠在一起的筐图案,中心花色与外筐花色字符从内层起交错相叠,多筐相叠时,最外筐的角总是被打磨掉。叠筐与叠筐之间应有一行间隔。
Sample Input 11 B A 5 @ W
Sample Output AAAAAAAAA ABBBBBBBBBA ABAAAAAAABA ABABBBBBABA ABABAAABABA ABABABABABA ABABAAABABA ABABBBBBABA ABAAAAAAABA ABBBBBBBBBA AAAAAAAAA
@@@ @WWW@ @W@W@ @WWW@ @@@
Author qianneng
Source
Recommend linle |
题记:
此题为打印图案问题。
可以把字符图案按要求存储在字符串数组中,再输出。
要注意n=1的特殊情况。
注意到图案是上下左右对称的,利用这点存储起来快捷方便。
也可以配合使用STL中的map映射来解,此解法没有用到。
C++程序如下:
#include <iostream>
#include <cstdio>
using namespace std;
char s[85][85];//储存在字符串数组中,再输出
int main()
{
char a,b;
int n;
int flag=0; //换行标记
while(~scanf("%d %c %c",&n,&a,&b)){
if(flag)
cout<<endl;
if(n==1){
cout<<a<<endl;
continue;
}//特殊情况
int mid=n/2+1;
s[mid][mid]=a;//中心
for(int i=1;i<=n/2;i++){
for(int j=mid-i;j<=mid+i;j++){
if(i%2) s[mid-i][j]=s[mid+i][j]=s[j][mid-i]=s[j][mid+i]=b;
else s[mid-i][j]=s[mid+i][j]=s[j][mid-i]=s[j][mid+i]=a;
}
} //上下左右对称
s[1][n]=s[1][1]=s[n][1]=s[n][n]=' ';//四个角是空的
//输出
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<s[i][j];
}
cout<<endl;
}
flag=1;
}
return 0;
}