主题:求一段代码
hereforc
[专家分:210] 发布于 2011-03-08 00:44:00
如题 求一段代码 要求从1到n的平方顺时针打印出 比如1 2 3
8 9 4
7 6 5
回复列表 (共3个回复)
沙发
ckrok [专家分:30] 发布于 2011-03-08 12:03:00
#include <stdio.h>
#define MAX 100
int num[MAX][MAX];
int st[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int main()
{
int n,n2,i,j,k,a;
scanf("%d",&n);
n2 = n * n;
for(i = 0;i <= n + 1;i++)
for(j = 0;j <= n + 1;j++)
if(i == 0 || j == 0 || i == n + 1 || j == n + 1)
num[i][j] = -1;
for(k = 1,i = 1,j = 1,a = 0;k <= n2;k++)
{
num[i][j] = k;
i += st[a][0];
j += st[a][1];
if(num[i][j] != 0)
{
i -= st[a][0];
j -= st[a][1];
a++;
if(a > 3) a = 0;
i += st[a][0];
j += st[a][1];
}
}
for (i = 1;i <= n ;i++)
{
for(j = 1;j <= n ;j++)
printf("%4d",num[i][j]);
printf("\n\n");
}
}
板凳
hereforc [专家分:210] 发布于 2011-03-08 13:42:00
谢谢哈
3 楼
windy0will [专家分:2300] 发布于 2011-03-08 15:21:00
1楼的方法不错。把输出的数据看成平面坐标的话,主要依据横坐标x的增量为1,0,-1,0(循环),纵坐标y的增量为0,1,0,-1(循环)。
其实也可以按圈来填充数据。比如说n=4,首先填充最外圈
(top )1 2 3 4(right)
12 5 然后 (top )13 14(right)
11 6 (left)16 15(bottom)
(left)10 9 8 7(bottom),
对于每填充一圈,把四个角分别称为top(顶) right(右) bottom(底) left(左)
然后 从top向右 从bottom向左 从right向下 从left向上 四个方向同时填充数据。
如果知道top的坐标和对应的值,很容易把这一圈全部填完。
这里面还有很多隐藏的规律,如 顶行与底行之和 左行与右行之和 都是定值。下面的代码可稍做优化。
[code=c]
#include <stdio.h>
#define FOO 100
int main ( void )
{
int i, j;
int n, xl, xr;
int a [FOO] [FOO];
int left, right, top, bottom;
scanf ( "%d", &n );
xl = 0; /* 最左上的坐标为(xl,xl) */
xr = n - 1; /* 最右下的坐标为(xr,xr) */
left = 1;
for ( ; xr > xl; xl++ , xr-- )
{
int walk = xr - xl;
int ytop = xl, ybottom = xr; /* 顶部和底部坐标的y值 */
int xleft = xr, xright = xl; /* 左部和右部坐标的x值 */
top = left; /* top对应的值 */
right = left + 1 * walk;
bottom = left + 2 * walk;
left = left + 3 * walk;
while ( ytop < xr )
{
a [xl] [ ytop++ ] = top ++; /* 从top向右 */
a [xr] [ybottom--] = bottom ++; /* 从bottom向左 */
a [xleft-- ] [xl] = left ++; /* 从left向上 */
a [xright++] [xr] = right ++; /* 从right向下 */
}
}
if ( xl == xr ) /* 如果n是奇数,最后一个数n*n */
a [xr] [xr] = n * n;
for ( i = 0; i < n ; i++ ) { /* 输出 */
for ( j = 0; j < n ; j++ )
printf ( "%4d ", a [i] [j] );
printf ( "\n\n" );
}
return 0;
}[/code]
我来回复