您的位置:首页 > 其它

软件大赛校内选拔赛题:蛇形填数

2012-12-05 16:36 316 查看
输入正整数N,比如:5
输出蛇形矩阵:1 3 4 10 11
2 5 9 12 19
6 8 13 18 20
7 14 17 21 20
15 16 22 27 25

#include<stdio.h>
int main()
{
int n,i,j,a[101][101],k=2,p;
i=1;j=1;a[i][j]=1;
scanf("%d",&n);
while(k<=n*n)
{

if(j==1||i==n)//向下、右方向填充
{
if(i<n)//没有达到下边界之前的情况
{
i++;//向下延伸一步,并标记为p=1,即已经完成延伸过程
a[i][j]=k++;
if(k==n*n+1) break;
p=1;
}
else
{
j++;//如果已经达到下边界,则不能再向下延伸而是向右延伸,并进行标记
a[i][j]=k++;
if(k==n*n+1) break;
p=1;
}
}
if(p==1)//延伸之后开始斜向填充
{
if(i<n)//没有达到下边界之前,每次斜向填充还可以到达上边界,故可以用来作为循环条件
{
while(i!=1)
{
i--;j++;
a[i][j]=k++;
if(k==n*n+1) break;

}
}
else//达到下边界之后的斜向填充不能再回到第一行,但是每次应该结束时都会达到右边界,故可以作为循环条件
{
while(j!=n)
{
i--;j++;
a[i][j]=k++;
if(k==n*n+1) break;
}
}
p=2;
}
if(i==1||j==n)//和上面过程对称的,方法基本一样
{
if(j<n)
{
j++;
a[i][j]=k++;
if(k==n*n+1) break;
p=2;
}
else
{
i++;
a[i][j]=k++;
if(k==n*n+1) break;
p=2;
}
}
if(p==2)
{
if(j<n)
{
while(j!=1)
{
i++;j--;
a[i][j]=k++;
if(k==n*n+1) break;
}
}
else
{
while(i!=n)
{
i++;j--;
a[i][j]=k++;
if(k==n*n+1) break;
}
}
p=1;
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%d\t",a[i][j]);
printf("\n\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: