思路:
1.数组这样创建
因为数组的下标是从0开始,为了方便我便创建一个array[n+1][n+1]大的二维数组,这样我就可以不用管索引0,直接从坐标(1,1)开始.
n的范围是[1,1000],所以创建二维数组array[1001][1001] (我不知道编译器是否支持变长数组,所以就保险起见把所有范围都开了)
2.明确蛇形的构造
我画一个图来方便大家观看.
我们可以看见,移动的方向只有两个:
- 右上和右
- 左下和下
3.逻辑的推理
所以,我用pos变量表示方向,其中1代表右上与右,-1代表左下与下.
用i
代表行-------------j
代表列
运动情况分为6种:
- 碰到上边界(即i等于1 且 j小于n): 列增加1,行不变--------往右移动一格
- 碰到左边界(即j等于1 且 i小于n): 行增加1,列不变--------往下移动一格
- 碰到右边界(即j等于n): 行增加1,列不变--------往下移动一格
- 碰到下边界(即i等于n): 列增加1,行不变--------往右移动一格
以上四种是在边界上面移动.只有向右 和 向下
- 除去上面四种的边界情况,就是在边界中间的左下移动
- 除去上面四种的边界情况,就是在边界中间的右上移动
最后两种是在边界内移动 只有右上和左下
4.代码开始上传
首先默认(1,1)位置已经有1了,上代码:
#include <stdio.h> int array[1001][1001] = { 0 }; int main(void) { int n = 0; scanf("%d",&n); int i = 1, j = 1, k = 0,pos = 1; //pos代表方向移动 1代表右上 -1代表左下 array[i][j] = 1; for (k = 2; k <= n*n; k++) { if (i == 1 && j <n && pos ==1) //碰到上边界,列增加1,行不变 此后行增,列减 { array[i][++j] = k; pos = -1; //方向注意 } else if(j==1 && i<n && pos == -1)//碰到左边界,行增加1,列不变 此后行减,列增 { array[++i][j] = k; pos = 1; //方向注意 } else if (j == n && pos==1) //碰到左边界,行增加1,列不变 此后行增,列减 { array[++i][j] = k; pos = -1; //方向注意 } else if (i == n && pos ==-1) //碰到右边界,列增加1,行不变 此后行减,列增 { array[i][++j] = k; pos = 1; } else if (pos == 1) //除去上面的边界情况,就是中间移动过程 { array[--i][++j] = k; } else if(pos == -1) { array[++i][--j] = k; } } for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) printf("%d ",array[i][j]); printf("\n"); } return 0; }