1.
1 3 6 10
2 5 9
4 8
7
void arrange(int n) { //n为打印数字的个数
int note = 1, sum = 0, count = 1;
while (sum < n) {
sum += note;
note++;
}
int arr[note][note] = {0};//浪费至少一半的空间
//赋值
for (int i = 1; i < note; i++) {
for (int j = 1; j <= i; j++) {
if (count <= n)
arr[i-j+1][j] = count++;
else break;
}
if (count > n) break;
}
//打印
for (int i = 1; i < note; i++) {
for (int j = 1; j < note; j++) {
if (arr[i][j] != 0)
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
2.
1
4 2
6 5 3
算法和以上相似,改动赋值坐标,打印函数空格也可以加入考虑,例如n = 13等情况
void arrange(int n) { //n为打印数字的个数
int note = 1, sum = 0, count = 1;
while (sum < n) {
sum += note;
note++;
}
int arr[note][note] = {0};//浪费至少一半的空间
//赋值
for (int i = 1; i < note; i++) {
for (int j = 1; j <= note-i; j++) {
if (count <= n)
arr[i+j-1][j] = count++;
else break;
}
if (count > n) break;
}
//打印
for (int i = 1; i < note; i++) {
for (int j = 1; j <= i; j++) {
if (arr[i][j] == 0)
printf(" ");
else
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
3.正方形矩阵
1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1
void arrange(int n) { //n为正方形矩阵的行列数
int arr[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
int min = (i-0);
if (min > (n-1-i)) min = (n-1-i);
if (min > (j-0)) min = (j-0);
if (min > (n-1-j)) min = (n-1-j);
arr[i][j] = min+1;
}
}
//打印
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++)
printf("%d ", arr[i][j]);
printf("\n");
}
}
4.蛇形填数
在n*n方陈里填入1,2,...,n*n,要求填成蛇形。例如n=4时方陈为:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
void arrange(int n) {
int arr[100][100], count = 0, x = 0, y = -1;
while (count < n*n) {
while (y+1 < n && arr[x][y+1] == 0) {arr[x][++y] = ++count;}
while (x+1 < n && arr[x+1][y] == 0) {arr[++x][y] = ++count;}
while (y-1 >= 0 && arr[x][y-1] == 0) {arr[x][--y] = ++count;}
while (x-1 >= 0 && arr[x-1][y] == 0) {arr[--x][y] = ++count;}
}
for (int i = 0 ; i < n; i++) {
for (int j = 0; j < n; j++)
printf("%d ", arr[i][j]);
printf("\n");
}
}