http://acm.hdu.edu.cn/showproblem.php?pid=2074
image.png
错误思路:每一次输出一个字符,根据条件判断,交换两个字符,在第一行不交换,第二行前后共交换两次,以此类推,在中间那一行达到每输出一个字符就交换一次。
出现问题:无法拟定一个正确的公式来满足交换规律,难度较高。
正确思路:将叠框拆分成一个个小框,用字符数组将其储存起来,每一个框存入数组后进行字符交换
代码如下:
#include<stdio.h>
#include<string.h>
int main()
{
int t, i, j,k,q=1;
char n, m, temp;
char a[100000];
while (scanf("%d %c %c", &t, &n, &m) != EOF)
{
if (t % 2 == 0 || t < 1 || t>79) break;
if (q != 1) printf("\n");//为了满足输出格式要求,需要在每一个叠框之间输出换行。
if ((t / 2 + 1) % 2 == 1)//因为要从最外面一圈开始存入,需要判断最外圈的字符是n还是m,默认是m,如果不是就交换两个字符。
{
temp = m;
m = n;
n = temp;
}
for (i = 0; i < t/2+1; i++)//一共有多少圈,计算圈数
{
for (j = i; j <t-i; j++)//列,不难发现,第二个框会从第i个位置开始,然后在t-i的位置结束
{
for (k = i; k < t-i; k++)//行同上。
{
a[j*t+k] = m;//字符在数组里,根据其行列位置进行储存
}
}
temp = m;//储存后字符交换
m = n;
n = temp;
}
a[0] = ' ';//将四个角字符替换成空格
a[t-1] = ' ';
a[t*(t - 1)] = ' ';
a[t*t-1] = ' ';
for (i = 1; i <=t*t; i++)
{
printf("%c", a[i-1]);
if (i % t== 0&&i!=0) printf("\n");
}
q++;
}
}
image.png
经过对比,与网络上标准答案输出结果一模一样。