本题直接用程序模拟规律即可
规律如下:
行坐标i,列坐标j (均从1开始)
下标和为偶数
向右上方平移,即i+1,j-1
- 如果上越界,需要向右平移j+1
- 如果右越界,需要向下平移i+1
- 可以看成只要右越界,就一定向下(i+1),所以判断右越界先于判断上越界
下标和为奇数
- 如果上越界,需要向右平移j+1
向左下方平移,即j-1,i+1
同上述分析,只要下越界,必然向右平移,即j+1,i不变
没有下越界,只有左越界,向下平移,j不变,i+1
这样就模拟出坐标的运动。
只需要设出初始位置(1,1),其值为1,下面循环 直到加的数字n==规格的平方即可。
代码如下:#include<bits/stdc++.h> using namespace std; int main() { int q = 0;//规格 scanf("%d",&q); int a[1001][1001]={0}; // freopen("data.txt", "r", stdin); int n=1;//每次填入的数字 a[1][1]=1; int i=1;int j=1;//行列坐标 while(n!=q*q){ if ((i+j)%2==0){ if (j+1>q||j+1<=0){//右越界(先判断) i = i+1; } else if (i-1<=0||i-1>q){//上越界 j = j+1; } else{//没越界 j = j+1; i = i-1; } } else{ if (i+1>q||i+1<=0){//下越界(先判断) j = j+1; } else if (j-1<=0||j-1>q){ i = i+1;//左越界 } else{ j = j-1; i = i+1; } } n++; a[i][j]=n; } //显示即可 for(int i=1;i<=q;i++){ for(int j=1;j<=q;j++){ if (j!=q) printf("%d ",a[i][j]); else if (j==q) printf("%d\n",a[i][j]); } } return 0; }