公布答案啊
#include<stdio.h>
int main()
{
int i,j,n=0,m,N=2,a[6][7]={0},k=0;
i=6/2-1;j=7/2;
while(k<3)
{
m=(n%10)/2+1+n/10*5+j;
for(--N;j<=m;j++)
a[i][j]=N++;
n++;
m=(n%10)/2+1+n/10*5+i;
for(--N,--j;i<=m;i++)
a[i][j]=N++;
n++;
m=j-((n%10)/2+1+n/10*5);
for(--i,--N;j>=m;j--)
a[i][j]=N++;
n++;
j=m;
m=i-((n%10)/2+1+n/10*5);
for(--N;i>=m;i--)
a[i][j]=N++;
n++;
i=m;
k++;
}
for(i=0;i<6;puts(""),i++)
for(j=0;j<7;j++)
printf("%3d",a[i][j]);
return 0;
}
#include<stdio.h>
#define F(n) ((n)%10)/2+1+(n)/10*5
int main()
{
int i,j,n=0,m,N=2,a[6][7]={0};
i=6/2-1;j=7/2;
while(N<=42)
{
m=F(n)+j;
for(--N;j<=m;j++)
a[i][j]=N++;
n++;
m=F(n)+i;
for(--N,--j;i<=m;i++)
a[i][j]=N++;
n++;
m=j-(F(n));
for(--i,--N;j>=m;j--)
a[i][j]=N++;
n++;
j=m;
m=i-(F(n));
for(--N;i>=m;i--)
a[i][j]=N++;
n++;
i=m;
}
for(i=0;i<6;puts(""),i++)
for(j=0;j<7;j++)
printf("%3d",a[i][j]);
return 0;
}
[此贴子已经被作者于2007-5-27 10:24:53编辑过]
这个是我写的
主要思想就是叫数组来进行 向下 向右 向上 向左 的 移动
#include<stdio.h>
main()
{
int x=0,y=0,i=42,c,b;
int a[6][7]={0};
a[x][y]=i;
while((i--)>1)
{
if(a[x+1][y]==0&&(x+1)<6)
a[++x][y]=i;
else if(a[x][y+1]==0&&(y+1)<7)
a[x][++y]=i;
else if(a[x-1][y]==0&&(x-1)!=-1)
a[--x][y]=i;
else if(a[x][y-1]==0&&(y-1)!=-1)
{
while(a[x][y-1]==0)
a[x][--y]=i--;
i++;
}
}
for(c=0;c<6;c++){
for(b=0;b<7;b++)
printf("%3d",a[c][b]);
printf("\n");
}
}
[此贴子已经被作者于2007-5-27 3:07:30编辑过]
注意:M可以等于N,或者M比N小1(比如M=8时,N可以等于8或者9)
#include <stdio.h>
#define M 8
#define N 9
int x[4] = {0, 1, 0, -1};
int y[4] = {1, 0, -1, 0};
int main()
{
int a[M][N], t, k, flag = 1;
int i = (M - 1) / 2, j = (N - 1) / 2;
a[i][j] = 1;
k = 2;
for (t = 1; flag; t += 2)
{
int p, q;
for (p = 0; p < 4 && flag; p++)
for (q = 0; q < t + p/2; q++)
{
i += x[p];
j += y[p];
a[i][j] = k++;
if (k > M * N)
{
flag = 0;
break;
}
}
}
for (i = 0; i < M ; i++)
{
for (j = 0; j < N; j++)
printf("%4d", a[i][j]);
printf("\n");
}
return 0;
}
总结一下:
(1)右下旋
当:
int x[4] = {0, 1, 0, -1};
int y[4] = {1, 0, -1, 0};
int i = (M - 1) / 2, j = (N - 1) / 2;
结果为:
42 21 22 23 24 25 26
41 20 7 8 9 10 27
40 19 6 1 2 11 28
39 18 5 4 3 12 29
38 17 16 15 14 13 30
37 36 35 34 33 32 31
(2)左下旋
当:
int x[4] = {0, 1, 0, -1};
int y[4] = {-1, 0, 1, 0};
int i = (M - 1) / 2, j = N / 2;
结果为:
26 25 24 23 22 21 42
27 10 9 8 7 20 41
28 11 2 1 6 19 40
29 12 3 4 5 18 39
30 13 14 15 16 17 38
31 32 33 34 35 36 37
(3)右上旋
当:
int x[4] = {0, -1, 0, 1};
int y[4] = {1, 0, -1, 0};
int i = M / 2, j = (N - 1) / 2;
结果为:
37 36 35 34 33 32 31
38 17 16 15 14 13 30
39 18 5 4 3 12 29
40 19 6 1 2 11 28
41 20 7 8 9 10 27
42 21 22 23 24 25 26
(4)左上旋
当:
int x[4] = {0, -1, 0, 1};
int y[4] = {-1, 0, 1, 0};
int i = M / 2, j = N / 2;
结果为:
31 32 33 34 35 36 37
30 13 14 15 16 17 38
29 12 3 4 5 18 39
28 11 2 1 6 19 40
27 10 9 8 7 20 41
26 25 24 23 22 21 42
注:M可以等于N,或者M比N小1(以上结果为M=6,N=7)