/* 6. 矩阵中填数. 当给出 N*N 的矩阵,要求用程序填入下列形式的数: ① 倒填,例如N=5 ② 蛇形填数 ③ 回转填数 ┌─┬─┬─┬─┬─┐ ┌─┬─┬─┬─┬─┐ ┌─┬─┬─┬─┬─┐ │25│24│23│22│21│ │ 1│ 3│ 4│10│11│ │ 1│16│15│14│13│ ├─┼─┼─┼─┼─┤ ├─┼─┼─┼─┼─┤ ├─┼─┼─┼─┼─┤ │20│19│18│17│16│ │ 2│ 5│ 9│12│19│ │ 2│17│24│23│12│ ├─┼─┼─┼─┼─┤ ├─┼─┼─┼─┼─┤ ├─┼─┼─┼─┼─┤ │15│14│13│12│11│ │ 6│ 8│13│18│20│ │ 3│18│25│22│11│ ├─┼─┼─┼─┼─┤ ├─┼─┼─┼─┼─┤ ├─┼─┼─┼─┼─┤ │10│ 9│ 8│ 7│ 6│ │ 7│14│17│21│24│ │ 4│19│20│21│10│ ├─┼─┼─┼─┼─┤ ├─┼─┼─┼─┼─┤ ├─┼─┼─┼─┼─┤ │ 5│ 4│ 3│ 2│ 1│ │15│16│22│23│25│ │ 5│ 6│ 7│ 8│ 9│ └─┴─┴─┴─┴─┘ └─┴─┴─┴─┴─┘ └─┴─┴─┴─┴─┘ 以下为蛇形填数的答案*/#include <stdio.h>int main(void){ int i, //行变量 j, //列变量 n, //矩阵行数 cs, //从左上角(或右下角)开始到当前元素所在位置的三角形层数 z, //当前数值 c; //差值 char fx, //数值增大的方向 zy; //数值在左下角和右上角形成的对角中分线的左右位置,左三角形含中分线元素 printf("请输入矩阵的行数:"); scanf("%d",&n); for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ if(i+j<=n+1) zy='z'; //数值在左上角 else zy='y'; //数值在右下角 cs=i+j-1; //从左上角开始到当前元素所在位置的三角形层数 if(cs%2==1) fx='l'; //数值向左下方增大 else fx=1; //数值向右上方增大 if(zy=='z'){ z=(1+(cs-1))*(cs-1)/2+1; //当前元素所在层的最小值 if(fx=='l') c=i-1; //数值向左下方增加时,当前元素与最大值的差值为i-1 else c=j-1; //数值向右上方增加时,当前元素与最大值的差值为j-1 z+=c; //当前值=最大值-差值 } else{ //以下从右下角开始计算三角形 cs=(2*n-1)-(cs-1); //从右下角反算当前元素距右下角的层数,其奇偶性不变 z=n*n-(1+cs)*cs/2+1; //当前层的最小数 if(fx=='l') c=n-j; //当前元素距当前层最小元素的差值 else c=n-i; //同上 z+=c; } printf("%4d",z); if(j==n) printf("\n"); } } return 0;}

评论