给你一个整数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
#includeint 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 =row;i--) arr[col][i]=++count;//下行 for(i=col-1;i>=row+1;i--) arr[i][row]=++count;//左列 row++; col--; } //打印 for(i=0;i 补充: 本题并不是一个特别难的题,它是一个简单题。而它的难点在于不能跳跃思维惯性。
例如:我们的代码中,我们定义了行变量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补充: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 的顺序是可以变的,大家可以尝试一下。



