描述
在一个m*n的数组中,按照Zig-Zag的顺序依次填写1,2,3,…m*n。
输入
两个整数m,n表示m*n的矩阵,整数间以空格隔开。2<=m,n<100
输出
输出矩阵
样例1
输入
3 3
输出
1 2 6
3 5 7
4 8 9
样例2
输入
2 3
输出
1 2 5
3 4 6
解决方案:
解决的想法是对下标进行找规律变换,在做的过程中发现在对角线之前和之后的边界是不一样的,于是分为两个部分来对矩阵下标赋值。
#include<stdio.h>
int main()
{
int m,n;
while(scanf("%d%d",&m,&n)!=EOF)
{
int tu[m][n];
int x=1;//要填的数
int i=0,j=0;//下标,i为横,j为纵
int flag=0;//flag==0向右上走,==1向左下走
while(i!=m&&j!=n)//结束条件是没填到最后一个位置
{
tu[i][j]=x;//填数
x++;
//控制下标指向的位置
if(flag==0)//向右上走
{
if(j+1<n)//还没到对角线最右上角
{
if(i-1<0)//到最顶行了
{
j++;//右移
flag=!flag;//换方向
}
else//否则向右上走
{
i--;
j++;
}
}
else//到对角线了
{
i++;//下移
flag=!flag;//换方向
}
}
else//向左下走
{
if(i+1<m)//没到对角线最左下角
{
if(j-1<0)//到最左列了
{
i++;//下移
flag=!flag;//换方向
}
else//否则向左下角走
{
i++;
j--;
}
}
else//到最左下角了
{
j++;//右移
flag=!flag;//换方向
}
}
}
//打印
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(j!=n-1)//控制行尾空格不打印
{
printf("%d ",tu[i][j]);
}
else
{
printf("%d",tu[i][j]);
}
}
printf("\n");
}
}
return 0;
}
实现了测试样例