题目:
一、在n×n矩阵里填入1,2,3,…,n*n,要求:
1.填成螺旋矩阵
2.填成蛇形矩阵
3.将要求1中的螺旋矩阵顺时针旋转90度
例如n=4时的方阵如下图所示:
1.螺旋矩阵
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int n = 0, i = 0, j = 0;
scanf("%d", &n); //输入行列数
//动态申请n行n列的二维数组,如果觉得麻烦根据题目要求申请足够大的也行
int** num = (int**)malloc(sizeof(int*) * n);
for (i = 0; i < n; i++)
num[i] = (int*)malloc(sizeof(int) * n);
//我们接下来的思路就是一圈一圈往中心填数字,数字是逐渐递增的,用count来表示,初始值为1,结束时为n*n
int start = 0, finish = n - 1, count = 1; //start指当前行列最小值,finish指当前行列最大值
while (count <= n * n)
{
//找到题目里1开始的位置,我们开始,根据count增加的方向走
//每一圈的规律都是一样的,结束的标志就是count达到了指定的大小
for (j = start; j <= finish; j++) //从左向右,列增行不变
num[start][j] = count++;
for (i = start + 1; i <= finish; i++) //从上到下,行增列不变
num[i][finish] = count++;
for (j = finish - 1; j >= start; j--) //从右往左,列减行不变
num[finish][j] = count++;
for (i = finish - 1; i >= start + 1; i--) //从下向上,行减列不变
num[i][start] = count++;
start++; finish--; //缩圈,行列的最小值加1,最大值减1
}
for (i = 0; i < n; i++) //输出
{
for (j = 0; j < n; j++)
printf("%-5d", num[i][j]);
printf("\n");
}
//最后记得释放掉申请的内存
for (i = 0; i < n; i++)
free(num[i]);
free(num);
return 0;
}
2.蛇形矩阵
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int n = 0, i = 0, j = 0, count = 1;
scanf("%d", &n);
int** num = (int**)malloc(sizeof(int*) * n);
for (i = 0; i < n; i++)
num[i] = (int*)malloc(sizeof(int) * n);
i = j = 0;
num[i][j] = count++;//为num[0][0]赋值1
while (count <= n * n)
{
//if-else语句判断是横着走一个还是竖着走一个,并赋值
if (j < n - 1) j++;
else i++;
num[i][j] = count++;
while (i < n - 1 && j>0)//斜向下走,直到走到头
{
i++;
j--;
num[i][j] = count++;
}
//if-else语句判断是横着走还是竖着走,并赋值
if (i < n - 1) i++;
else j++;
num[i][j] = count++;
while (i > 0 && j < n - 1)//斜向上走,走到头
{
i--;
j++;
num[i][j] = count++;
}
}
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
printf("%-5d", num[i][j]);
printf("\n");
}
for (i = 0; i < n; i++)
free(num[i]);
free(num);
return 0;
}
3.将问题1的螺旋矩阵顺时针旋转90度而成的矩阵
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int n = 0, i = 0, j = 0;
scanf("%d", &n); //输入行列数
//动态申请n行n列的二维数组,如果觉得麻烦根据题目要求申请足够大的也行
int** num = (int**)malloc(sizeof(int*) * n);
for (i = 0; i < n; i++)
num[i] = (int*)malloc(sizeof(int) * n);
//我们接下来的思路就是一圈一圈往中心填数字,数字是逐渐递增的,用count来表示,初始值为1,结束时为n*n
int start = 0, finish = n - 1, count = 1; //start指当前行列最小值,finish指当前行列最大值
while (count <= n * n)
{
//找到题目里1开始的位置,我们开始,根据count增加的方向走
//每一圈的规律都是一样的,结束的标志就是count达到了指定的大小
for (i = start; i <= finish; i++) //从上到下,行增列不变
num[i][finish] = count++;
for (j = finish - 1; j >= start; j--) //从右往左,列减行不变
num[finish][j] = count++;
for (i = finish - 1; i >= start + 1; i--) //从下向上,行减列不变
num[i][start] = count++;
for (j = start; j <= finish - 1; j++) //从左向右,列增行不变
num[start][j] = count++;
start++; finish--; //缩圈,行列的最小值加1,最大值减1
}
for (i = 0; i < n; i++) //输出
{
for (j = 0; j < n; j++)
printf("%-5d", num[i][j]);
printf("\n");
}
//最后记得释放掉申请的内存
for (i = 0; i < n; i++)
free(num[i]);
free(num);
return 0;
}
二、将1-n×n 填入n行n列的方阵中,要求每行每列每条对角线上的数值求和相等(保证n一定为奇数)。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i = 0, j = 0, s = 0, n = 0;
scanf("%d", &n);
int* p = (int*)malloc(n * n * 4);
for (i = 0; i <= n - 1; i++)
{
for (j = 0; j <= n - 1; j++)
{
*(p + i * n + j) = 0;
}
}
s = 1;
i = 0;
j = (n - 1) / 2;
*(p + i * n + j) = s;
for (s = 2; s <= n * n; s++)
{
i--; j++;
if (i < 0 && j <= n - 1)//越过上边界,且没有超过右边界
{
i = n - 1; *(p + i * n + j) = s;
}
else if (j > n - 1 && i >= 0)//超过右边界,且没有超过上边界
{
j = 0; *(p + i * n + j) = s;
}
else if (0 <= i && i <= n - 1 && 0 <= j && j <= n - 1 && *(p + i * n + j) != 0)//在数组之内,且右上角有值
{
i = i + 2; j--; *(p + i * n + j) = s;
}
else if (i < 0 && j>n - 1)//既越过上边界,也越过右边界
{
i = i + 2; j--; *(p + i * n + j) = s;
}
else
*(p + i * n + j) = s;
}
for (i = 0; i <= n - 1; i++)
{
for (j = 0; j <= n - 1; j++)
{
printf("%-5d", *(p + i * n + j));
}
printf("\n");
}
return 0;
}