杭电2074叠筐
1.先摆出这有点坑的题目吧;题目不难但错误的次数真多啊;
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@
@@@
题目分析不难;用二维数组来做,先把这些字符都存起来;然而统一输出即可;与蛇形填数有些类似;
先不说这么多了直接拿代码分析吧;
#include<stdio.h>
int main()
{
int i, d, k, a, j, flag=0;
char b, c, m[100][100]={0},ch;
while(scanf("%d %c %c",&a, &b, &c) != EOF){
if(flag == 1){
printf("\n");
}
flag = 1;
if(a == 1){
printf("%c\n",b);
continue;
}
d = a/2;//中心位置;
m[d][d] = b;
for(k = 1; k <= d; k++){
if(k%2 == 1){
ch = c;
}
else ch = b;
for(i = d-k, j = d-k; i <= d+k; i++){
m[i][j] = ch;
}
for(i = d+k, j = d-k; j <= d+k; j++){
m[i][j] = ch;
}
for(i = d+k, j = d+k; i >= d-k; i--){
m[i][j] = ch;
}
for(i = d-k, j = d+k; j >= d-k; j--){
m[i][j] = ch;
}
}
m[0][0] = ' ';
m[a-1][0] = ' ';
m[a-1][a-1] = ' ';
m[0][a-1] = ' ';
for(i = 0; i < a; i++){
for(j = 0; j < a; j++){
printf("%c",m[i][j]);
}
printf("\n");
}
}
return 0 ;
}
先分析算法吧;m二维数组来存放字符;
1,找到中心位置,刚好是m[a/2][a/2];放入中心字符;
2,然后就走圈放字符到数组里面去;这里要找到边界(如代码的几个for语句就是这个意思);
3,最后在处理边框四角为空格的情况,这里只需要在上面赋值后再将那四个角的二维数组赋值一遍,即可;
4,最后在简单的输出二维数组即可;
好戏来了 我们来分析这些坑的细节格式的问题吧;
1;a==1语句
先看看这条语句吧;是不是没有想到啊;题目意思是从0到80 的奇数其中也是包括1的;
2;再让我们来看看flag的作用吧,是不是都想说这不就是跟放在后面的的换行一个意思吗;然而放在后的换行提交会是wa的;是不是很奇怪;再想想这二个有什么区别吧,没错把换行放在前面就是说输入一组数据才会有一个换行,而放在后面就是说每次输入数据之前就会出现换行,同于最后一个测试数据后面还有换行这与题目意思不同。题目只是说两个边框中间,有换行;则我们应该把换行放在前面;
是不是ac了;哈哈;现在来看是不是很坑;