Problem G: 输出回字形
Description
输出n阶的回字形。定义1、2、3阶的回字形如下。
1阶回字形:
@@@
@ @
@@@
2阶回字形
@@@@@@@
@ @
@ @@@ @
@ @ @ @
@ @@@ @
@ @
@@@@@@@
3阶回字形
@@@@@@@@@@@
@ @
@ @@@@@@@ @
@ @ @ @
@ @ @@@ @ @
@ @ @ @ @ @
@ @ @@@ @ @
@ @ @ @
@ @@@@@@@ @
@ @
@@@@@@@@@@@
Input
输入一个整数n,n取1~9。
Output
输出对应的图形。
Sample Input
2
Sample Output
@@@@@@@
@ @
@ @@@ @
@ @ @ @
@ @@@ @
@ @
@@@@@@@
HINT
Append Code
如果说求一元二次方程的根是因为麻烦我做不出来的话,这题就是因为我是真不会才写不出来的,想了好久尝试了很多次也没想到合适的办法。然后百度一下搜了一下应该咋做,人家上来就是一句“如果这题用for循环直接做的话恐怕要做上几个小时吧”。……这不就是我的想法吗,,,看完人家的题解然后恍然大悟,学到了坐标法这个神奇的方法。
https://www.cnblogs.com/Orzsl/p/10334951.html这个是原来博主的链接,感谢大佬!
大佬的AC码(以中间的空格为原点):
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
int x,y,n;
scanf("%d",&n);
for(x=-(2*n-1); x<=2*n-1; x++)
{
for(y=-(2*n-1); y<=2*n-1; y++)
{
if(x==0&&y==0)
putchar(' ');
else if(abs(x)%2!=0&&abs(x)>=abs(y))
putchar('@');
else if(abs(y)%2!=0&&abs(y)>abs(x))
putchar('@');
else
putchar(' ');
}
putchar('\n');
}
return 0;
}
我在了解到坐标法之后自己又进行了尝试,这是我以左下角为原点写出的码(也是调试了很多次很多次),感觉也不算一个好的代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
int x,y,n;
scanf("%d",&n);
for(x = 0; x<3+4*(n-1); x++)
{
for(y = 0; y<3+4*(n-1); y++)
{
if((x==3+4*(n-1)-1||x==0)&&y>=0||x>0&&(y==0||y==3+4*(n-1)-1))
putchar('@');
else if(y%2==0&&(x>=3+4*(n-1)-1-y&&x<=y)||y%2==0&&(x>=y&&x<=3+4*(n-1)-1-y)||x%2==0&&(y>=3+4*(n-1)-1-x)&&y<=x||x%2==0&&(y>=x&&y<=3+4*(n-1)-1-x))
putchar('@');
else
putchar(' ');
}
putchar('\n');
}
return 0;
}
优皇自己努力得出的AC码(佩服):
#include<stdio.h>
#include<math.h>
int main()
{
int n;
scanf("%d", &n);
for (int x = 1; x <= 2 * n; x++)
{
if (x % 2)
{
for (int y = 1; y <= 2 * n - 1; y++)
{
if (y <= x && y % 2 == 0)
putchar(' ');
else
putchar('@');
}
putchar('@');
for (int y = 2 * n - 1; y >= 1; y--)
{
if (y <= x && y % 2 == 0)
putchar(' ');
else
putchar('@');
}
}
else
{
for (int y = 1; y <= 2 * n - 1; y++)
{
if (y < x && y % 2 != 0)
putchar('@');
else
putchar(' ');
}
putchar(' ');
for (int y = 2 * n - 1; y >= 1; y--)
{
if (y <= x && y % 2 != 0)
putchar('@');
else
putchar(' ');
}
}
puts("");
}
for (int x = 2 * n - 1; x >= 1; x--)
{
if (x % 2)
{
for (int y = 1; y <= 2 * n - 1; y++)
{
if (y <= x && y % 2 == 0)
putchar(' ');
else
putchar('@');
}
putchar('@');
for (int y = 2 * n - 1; y >= 1; y--)
{
if (y <= x && y % 2 == 0)
putchar(' ');
else
putchar('@');
}
}
else
{
for (int y = 1; y <= 2 * n - 1; y++)
{
if (y <= x && y % 2 != 0)
putchar('@');
else
putchar(' ');
}
putchar(' ');
for (int y = 2 * n - 1; y >= 1; y--)
{
if (y <= x && y % 2 != 0)
putchar('@');
else
putchar(' ');
}
}
puts("");
}
return 0;
}
优皇用数组写出的精炼AC码:
#include<stdio.h>
char a[35][35];
int main()
{
int n, flag = 1;
scanf("%d", &n);
int min = 0, max = 4 * n - 2;
while (min <= max)
{
if (flag == 1)
for (int x = min; x <= max; x++)
for (int y = min; y <= max; y++)
a[x][y] = '@';
else
for (int x = min; x <= max; x++)
for (int y = min; y <= max; y++)
a[x][y] = ' ';
max--;
min++;
flag = -flag;
}
for (int x = 0; x <= 4 * n - 2; x++)
{
for (int y = 0; y <= 4 * n - 2; y++)
putchar(a[x][y]);
puts("");
}
return 0;
}
优皇yyds o( ̄▽ ̄)d👍👍👍