问题描述
解决方案
大概就是这样,建立笛卡尔坐标系。
用point()函数里的嵌套for循环来输出每一个字符,然后把代表坐标的i和j传递给getChar()函数通过坐标来决定输出的是什么字符。
解决方案二:
char getChar(int x,int y,int n)
{
if(x<0)
x=-x;
if(y<0)
y=-y;
if(x>y)
{
if(n-x<=2)
return 'x'+n-x;
else
return '0'+n-x-3;
}
else
{
if(n-y<=2)
return 'x'+n-y;
else
return '0'+n-y-3;
}
}
int print(int n)
{
for(int i=-n+1;i<n;i++)
{
for(int j=-n+1;j<n;j++)
{
printf("%c",getChar(j,i,n-1));
}
printf("n");
}
return 0;
}
int main()
{
int a;
scanf("%d",&a);
print(a);
return 0;
}
解决方案三:
二维数组不是更简单吗?
解决方案四:
个人比较倾向于二维数组
解决方案五:
非常感谢 a1193561652 纵横车 的帮助,给了我思路和方法。我把方法总结如下:
很显然,图是中心对称的。即相同的字符与中心的字符的相对位置是相同的,比如,n=4时,字符a距离中心点字符d的是3格(a在第三环),b距离d是2格(b在第二环),c距离d是1环。刚好,字符与中心点字符的距离就是两者之间的ascii码之差,比如 'd'-'a'=3。 就是说,只要算出要打印的字符与中心点字符d的距离(第几环),就可以得到要打印的字符的ascii码。计算两点之间的距离(第几环),很简单,分别计算两点的坐标X相减的绝对值和坐标Y相减的绝对值,取最大者即可。用代码表示为:max(abs(x1-x2),abs(y1-y2)) 每个点的坐标用行号,列号表示。假设左上角字母a坐标为(0,0),右下角字母a坐标为(2*n-2, 2*n-2), 则中心点d的坐标为(n-1,n-1)。
代码如下:
char mygetchar(int x, int y, int n)
{
int m = max(abs(x-(n-1)), abs(y-(n-1)));
return (char)('a' + n - 1 - m);
}
void myprint(int n)
{
int x, y;
for (y = 0; y < 2*n-1; y++)
{
for (x = 0; x < 2*n-1; x++)
{
printf("%c", mygetchar(x,y,n));
}
printf("n");
}
}
void main()
{
int a;
scanf("%d", &a);
myprint(a);
}
对于原题,只需要在此代码基础上,增加一个判断,若在最外面的三环,则输出x,y,z, 在其他环,则输出0~9。代码就不写了。