1.回型矩阵
题目描述:
给你一个整数n,按要求输出n∗n的回型矩阵。
输入输出要求:
输入要求:输入一行,包含一个整数n,1<=n<=19。
输出要求:输出n行,每行包含n个正整数.
输入输出案例:
案例1
输入:4
输出: 1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
代码实现:
#include <stdio.h>
int main()
{
//输入n
int n=0;
scanf("%d",&n);
//定义二维数组
int arr[20][20]={0};
//定义行、列边界
int row=0;
int col=n-1;
//定义控制行、列变量
int i=0;
int j=0;
//计数
int count=0;
while(count <n*n)
{
for(i=row;i<=col;i++)
arr[row][i]=++count;//上行
for(i=row+1;i<=col;i++)
arr[i][col]=++count;//右列
for(i=col-1;i>=row;i--)
arr[col][i]=++count;//下行
for(i=col-1;i>=row+1;i--)
arr[i][row]=++count;//左列
row++;
col--;
}
//打印
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
return 0;
}
补充:
本题并不是一个特别难的题,它是一个简单题。而它的难点在于不能跳跃思维惯性。
例如:我们的代码中,我们定义了行变量row、i,定义了列变量col、j。现在我们知道行变量是控制行的,列变量是控制列的。但是行就不能写成列?列就不能写成行?实际上,row、i、col、j等等这些变量的本质还是数字,只不过我们为了方便强行赋予某某变量具有什么什么作用而已。
比如代码中的这串代码:
for(i=row;i<=col;i++)
arr[row][i]=++count;//上行
可以看到 i 写到列下标去了。事实上我们打印二维数组最上行,需要的就是列变量是变化的,行变量是不动的。
2.蛇型矩阵
题目描述:
给你一个整数n,输出n∗n的蛇形矩阵。
输入输出要求:
输入要求:输入一行,包含一个整数n
输出要求:输出n行,每行包含n个正整数,通过空格分隔。1<=n<=1000
输入输出案例:
案例1
输入:4
输出:1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16
代码实现:
#include <stdio.h>
int main()
{
//输入n
int n = 0;
scanf("%d", &n);
//定义二维数组
int arr[100][100] = { 0 };
//第一个点位
arr[0][0] = 1;
//从2开始计数
int count = 2;
//控制行、列变量
int i = 0;
int j = 0;
//state为1,往右上方打印;state为-1,往左下打印
int state = 1;
while (count <= n * n)
{
//最上行,并改变方向
if (state == 1 && i == 0 && j < n - 1)
{
arr[i][++j] = count++;
state = -1;
}
//最左列,并改变方向
else if (state == -1 && j == 0 && i < n - 1)
{
arr[++i][j] = count++;
state = 1;
}
//最右列,并改变方向
else if (state == 1 && j == n-1 && i < n - 1)
{
arr[++i][j] = count++;
state = -1;
}
//最下行,并改变方向
else if (state == -1 && i == n - 1 && j < n - 1)
{
arr[i][++j] = count++;
state = 1;
}
//当方向为右上
else if (state == 1)
{
arr[--i][++j] = count++;
}
//当方向为左下
else if (state == -1)
{
arr[++i][--j] = count++;
}
}
//打印
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
补充:
通过观察代码可以发现逻辑非常简单:
我们可以通过观察这幅图就不难理解上面的代码。只有在边界才会出现紫色箭头连续+1的情况,每次出现这种情况必然会带有方向的改变。
上面的代码 if else 的顺序是可以变的,大家可以尝试一下。