蛇形填数
时间限制:3000 ms | 内存限制:65535 KB
难度:3
- 描述
- 在n*n方陈里填入1,2,...,n*n,要求填成蛇形。例如n=4时方陈为:
- 10 11 12 1
- 9 16 13 2
- 8 15 14 3
- 7 6 5 4
- 输入
- 直接输入方陈的维数,即n的值。(n<=100)
- 输出
- 输出结果是蛇形方陈。
- 样例输入
- 3
- 样例输出
- 7 8 1
- 6 9 2
- 5 4 3
- 思路:手撸n=2,3,4,5,6,7,会发现各个位置的数字没有加减规律,不能直接打印,所以必须先赋值,再打印;赋值是从1开始,向里面旋转赋值,n为奇数有个中心点可以打出来,如果是偶数则没有中心点,比较麻烦。n*n矩阵,1从最后一列开始向下赋值,赋值到尽头向左,赋值到尽头再向上,然后再向左向下,循环下左上右。
- 举例n=6,先打从1开始向下初始化6次,然后向左5次,向上5次,向右4次,向下4次,向左3次,向上3次,向右2次,向下2次,向左1次,向上1次。
- 简单点表示,循环下左右上,分别初始化赋值 6 5 5 4 4 3 3 2 2 1 1次
- 再举例n=5,先打从1开始向下初始化5次,然后向左4次,向上4次,向右3次,向下3次,向左2次,向上2次,向右1次,向下1次。
- 简单点表示,循环下左右上,分别初始化赋值5 4 4 3 3 2 2 1 1次
- 发现规律,先初始化赋值一列n个,之后每次初始化赋值次数逐渐减少,并且矩阵一行一列的初始化个数一样。
- 第一列比较特殊,可以另外初始化,其他则按规律写代码,那就是左上右下赋值。
- 需要实现的功能:1、拐弯,左上右下的规律 2、n到1逐渐递减 3、每次赋值2次 4、数组内容逐渐增加
- AC代码:
#include<stdio.h> #include<iostream> #include<cstring> using namespace std; int a[101][101]; ///左上右下 int shu[4]={0,-1,0,1}; int heng[4]={-1,0,1,0}; int main() { memset(a,0,sizeof(a)); int n; scanf("%d",&n); for(int i=1;i<=n;i++) ///先赋值最后一列 a[i][n]=i; int num; ///每次赋值到底的个数 num=n-1; ///从n-1开始 int f=0,r; ///判断方向,r=f%4,0123分别是左上右下 int x=n,y=n,m=n; ///数组下标,从右下角开始 for(int i=num;i>=1;i--) { int t=2; while(t--) { r=(f++)%4; for(int j=0;j<i;j++)///i次 { x=x+shu[r]; y=y+heng[r]; a[x][y]=++m; } } } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) if(j!=n) printf("%d ",a[i][j]); else printf("%d ",a[i][j]); } return 0; }