叠筐
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 24295 Accepted Submission(s): 6405
Problem Description
需要的时候,就把一个个大小差一圈的筐叠上去,使得从上往下看时,边筐花色交错。这个工作现在要让计算机来完成,得看你的了。
Input
输入是一个个的三元组,分别是,外筐尺寸n(n为满足0<n<80的奇整数),中心花色字符,外筐花色字符,后二者都为ASCII可见字符;
Output
输出叠在一起的筐图案,中心花色与外筐花色字符从内层起交错相叠,多筐相叠时,最外筐的角总是被打磨掉。叠筐与叠筐之间应有一行间隔。
Sample Input
11 B A5 @ W
Sample Output
AAAAAAAAA ABBBBBBBBBAABAAAAAAABAABABBBBBABAABABAAABABAABABABABABAABABAAABABAABABBBBBABAABAAAAAAABAABBBBBBBBBA AAAAAAAAA @@@ @WWW@@W@W@@WWW@ @@@
Author
qianneng
Source
问题链接:HDU2074 叠筐
问题描述:(略)
问题分析:
这是一个打印字符图案的问题。
该问题的关键是,需要先算出打印几圈,然后一圈一圈地打印。圈控制变量(程序中的k)映射为行和列下标是关键。还需要注意特殊情况。
程序说明:(略)
参考链接:(略)
题记:(略)
AC的C++语言程序如下:
/* HDU2074 叠筐 */
#include <iostream>
#include <stdio.h>
using namespace std;
const int N = 80;
char m[N][N];
int main()
{
int n, ccnt = 0;
char a, b, c;
while(~scanf("%d %c %c", &n, &a, &b)) {
int r = 0;
for (int k = (n + 1) / 2 - 1; k >= 0; k--) {
c = (r % 2 == 0) ? a : b;
r++;
// 画横线
for (int i=k, j=i; j<n-i; j++) {
m[i][j] = c;
m[n - i - 1][j] = c;
}
// 画竖线
for (int i=k, j=i; j<n-i; j++) {
m[j][i] = c;
m[j][n - i - 1] = c;
}
}
// 四个角
m[0][n - 1] = m[0][0] = ' ';
m[n - 1][0] = m[n - 1][n - 1] = ' ';
if(++ccnt != 1)
printf("\n");
if(n == 1)
printf("%c\n", a);
else {
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++)
printf("%c", m[i][j]);
printf("\n");
}
}
}
return 0;
}