杭电oj 2074(正确答案,不能AC)

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

经过对比,与网络上标准答案输出结果一模一样。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容