用C语言编写一个程序,要求输出字轮转组成一正方形,已n作为边长,比如:
1 | 12 | 11 | 10 |
2 | 13 | 16 | 9 |
3 | 14 | 15 | 8 |
4 | 5 | 6 | 7 |
1 | 16 | 15 | 14 | 13 |
2 | 17 | 24 | 23 | 12 |
3 | 18 | 25 | 22 | 11 |
4 | 19 | 20 | 21 | 10 |
5 | 6 | 7 | 8 | 9 |
n=5
请教中...
----------------解决方案--------------------------------------------------------
falg=1 下
falg=2 右
falg=3 上
falg=4 左
再设置一个变量控制每次走的长度.c,l(表示行,列,初始值为n,n)每做一次(flag的变化)来改变c,l的值.
----------------解决方案--------------------------------------------------------
具体代码可以实现看下吗?
----------------解决方案--------------------------------------------------------
加点解释
//打印数字,转圈
#include<stdio.h>
#define N 9 //N控制方阵的大小
int main(void)
{
int i=0,j=0,a[N][N]={1},k,flag=1; //flag控制数组变化的方向
for(k=1;k<N*N;k++)
{
switch(flag) //根据数组变化方向进行相应的加减
{
case 1:
i++;break;
case 2:
j++;break;
case 3:
i--;break;
case 4:
j--;break;
}
if(i>=N) //对超越数组范围的处理
{
flag=2;
i--;
j++;
}
if(j>=N)
{
flag=3;
j--;
i--;
}
if(i<0)
{
flag=4;
i++;
j--;
}
if(j<0)
{
flag=1;
j++;
i++;
} //对超越数组范围的处理
if(a[i][j]!=0) //如果数组元素已经赋值,改变方向
{
switch(flag)
{
case 1:
i--;j++;flag++;break;
case 2:
j--;i--;flag++;break;
case 3:
i++;j--;flag++;break;
case 4:
j++;i++;flag=1;break;
}
}
a[i][j]=k+1;
}
for(i=0;i<N;i++) //打印数组
{
for(j=0;j<N;j++)
printf("%5d",a[i][j]);
printf("\n\n");
}
return 0;
}
[此贴子已经被作者于2007-4-16 19:47:30编辑过]
----------------解决方案--------------------------------------------------------
# include<stdio.h>
void main()
{
int n=4;
int m=(n+1)/2;
int i,j,k=0;
int mat[4][4];
int t=0;
for(i=0;i<m;i++)
{
for(j=i;j<=n-i-1;j++)
mat[i][j]=++k;
for(j=i+1;j<=n-i-1;j++)
mat[j][n-i-1]=++k;
for(j=n-i-2;j>=i;j--)
mat[n-i-1][j]=++k;
for(j=n-i-2;j>=i+1;j--)
mat[j][i]=++k;
}
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{printf("%4d",mat[i][j]);
t++;
if(t%4==0)
printf("\n");}
return;
}
----------------解决方案--------------------------------------------------------
# include<stdio.h>
void main()
{
int n=4;
int m=(n+1)/2;
int i,j,k=0;
int mat[4][4];
int t=0;
for(i=0;i<m;i++)
{
for(j=i;j<=n-i-1;j++)
mat[i][j]=++k;
for(j=i+1;j<=n-i-1;j++)
mat[j][n-i-1]=++k;
for(j=n-i-2;j>=i;j--)
mat[n-i-1][j]=++k;
for(j=n-i-2;j>=i+1;j--)
mat[j][i]=++k;
}
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{printf("%4d",mat[i][j]);
t++;
if(t%4==0)
printf("\n");}
return;
}
----------------解决方案--------------------------------------------------------
#include "stdlib.h"
#include "stdio.h"
int main()
{
int N;
printf("input line:\n");
scanf("%d",&N);
int a[9][9] = {0};
int i,j,x;
int k = 0;
int m = 0,n = N;
int p;
for(p = 0;p<(N+1)/2;p++)
{
for(i = m,j = m;i<n-1;i++)
a[i][j] = ++k;
for(i = n-1,j = m;j<n-1;j++)
a[i][j] = ++k;
for(i = n-1,j = n-1;i>m;i--)
a[i][j] = ++k;
for(i = m,j = n-1;j>m;j--)
a[i][j] = ++k;
x = k+1;
m++;
n--;
}
if(N/2)
{
a[N/2][N/2] = x;
}
for(i = 0;i<N;i++)
{
for(j = 0;j<N;j++)
{
printf("%2d ",a[i][j]);
}
printf("\n");
}
system("pause");
}
----------------解决方案--------------------------------------------------------