/*矩阵倒填*/
#include <stdio.h>
#define N 20
int main()
{
int i, j, n, m;
int f[N][N] = {0};
printf("input a intger:");
scanf("%d", &n);
printf("\n");
m = n * n;
for (i=0; i<n; i++) {
for (j=0; j<n; j++)
f[i][j] = m--;
}
for (i=0; i<n; i++) {
for (j=0; j<n; j++)
printf("%3d", f[i][j]);
printf("\n");
}
printf("\n");
return 0;
}
/*螺旋矩阵*/
#include <stdio.h>
#include <stdlib.h>
#define N 20
int main()
{
int x, y, n, val;
int f[N][N] = {0};
printf("input a integer:");
scanf("%d", &n);
printf("\n");
val = 1;
for (x=0; x<(n+1)/2; x++) {
/*right*/ // 1 2 3 4
for (y=x; y<n-x; y++)
f[x][y] = val++;
/*down*/ // 5 6 7
for (y=x+1; y<n-x; y++)
f[y][n-x-1] = val++;
/*left*/ // 8 9 10
for (y=n-x-2; y>=x; y--)
f[n-x-1][y] = val++;
/*up*/ // 11 12
for (y=n-x-2; y>x; y--)
f[y][x] = val++;
}
/*输出螺旋数组*/
for (x=0; x<n; x++) {
for (y=0; y<n; y++)
printf("%5d", f[x][y]);
printf("\n\n");
}
printf("\n");
return 0;
}
/*螺旋矩阵_递归实现*/
#include <stdio.h>
#include <stdlib.h>
#define N 20
void change(int i, int j, int k, int m, int l, int (*t)[20])
{
if (!m)
return;
for (j=i; j<l-i; j++)
t[i][j] = k++;
for (j=i+1; j<l-i; j++)
t[j][l-i-1] = k++;
for (j=l-i-2; j>=i; j--)
t[l-i-1][j] = k++;
for (j=l-i-2; j>i; j--)
t[j][i] = k++;
change(i+1, j, k, --m, l, t);
}
int main()
{
int x, y, n, m, val;
int f[N][N] = {0};
printf("input a integer:");
scanf("%d", &n);
printf("\n");
x = 0;
y = 0;
val = 1;
m = (n+1)/2;
change(x, y, val, m, n, f);
/*输出螺旋数组*/
for (x=0; x<n; x++) {
for (y=0; y<n; y++)
printf("%5d", f[x][y]);
printf("\n\n");
}
printf("\n");
return 0;
}
/*蛇形填数*/
#include <stdio.h>
#include <stdlib.h>
#define N 20
int main()
{
int i, x, y, x1, y1, n, val, flag;
int f[N][N] = {0};
printf("input a integer:");
scanf("%d", &n);
printf("\n\n");
val = 1;
x = y = 0;
/*把矩阵斜看成一行一行 */
/*例如 1 | 2 3 | 4 5 6 | 7 8 9 10 | 11 12 13 | 14 15 | 16 */
for (i=0; i<2*n-1; i++) {
if (x != y) {
x1 = x;
y1 = y;
flag = x1 < y1 ? 1 : 0;
while (x1 != y) {
f[x1][y1] = val++;
if (flag) {
x1 = x1 + 1;
y1 = y1 - 1;
} else {
x1 = x1 - 1;
y1 = y1 + 1;
}
}
f[x1][y1] = val++;
x = x1;
y = y1;
} else {
f[x][y] = val++;
x++; //(0,0) --> (1,0)
continue;
}
/*坐标变化 每行处理*/
if (i < n-1) { //以对角线 区分上半部分和下半部分的坐标变化
x = x == 0 ? x : (x + 1);
y = y == 0 ? y : (y + 1);
} else {
x = x < y ? (x + 1) : x;
y = y < x ? (y + 1) : y;
}
}
/*输出蛇形数组*/
for (x=0; x<n; x++) {
for (y=0; y<n; y++)
printf("%5d", f[x][y]);
printf("\n\n");
}
printf("\n");
return 0;
}