#include<stdio.h> void snake_matrix(int arr[1000][1000],int n) { int i = 0; int j = 0; int sum = 1; int k = 0; while(sum <= n*n) { while(k < n-1) //上三角 { if(k % 2==0) { while(i>=0) //斜向上 { arr[i][j]=sum; sum++; i--; j++; } i++; //校正起点 k++; } if(k==n-1) break; if(k % 2 != 0) { while(j>=0) //斜向下 { arr[i][j]=sum; sum++; j--; i++; } j++; //校正起点 k++; } if(k==n-1) break; } while(k >= n-1) // 下三角 { if(k % 2 != 0) //斜向下 { while(i<=n-1) { arr[i][j]=sum; sum++; i++; j--; } j=j+2; //校正起点 i--; k++; } if(k % 2 == 0) //斜向上 { while(j<=n-1) { arr[i][j]=sum; sum++; j++; i--; } i = i+2; //校正起点 j--; k++; } if(sum>=n*n) { break; } } } } void printf_snake(int arr[1000][1000],int n ) //打印 { int i = 0; int j = 0; for(i=0;i<n;i++) { for(j=0;j<n;j++) { printf("%d ",arr[i][j]); } printf("\n"); } } int main() { int n = 0; scanf("%d",&n); int arr[1000][1000]; snake_matrix(arr,n); printf_snake(arr,n); return 0; }
#include <stdio.h> //拐弯分为u1横拐和u2竖拐,横拐行不变 列加一;竖拐列不变 行加一 //其他运动方式k分为k1斜上和k2斜下。 斜上:行递减,列递加;斜下:行递加,列递减 //k1,k2,u1,u2与n的关系: int main() { int n = 0; int i = 0, j = 0; int nj = 0; int ni = 0; scanf("%d", &n); if (n == 1) { printf("1 "); return 0; } int arr[20][20] = { 0 }; int a = 1; arr[0][0] = a; a++; while (a < n * n - 2) { if (j < n - 1) { j++; } else { nj++; j++; while (j > (1 + ni)) { j--; i++; arr[i][j] = a; a++; } ni++; goto star1; } arr[i][j] = a; a++; while (j > 0) { j--; i++; arr[i][j] = a; a++; } star1: if (i < n - 1) { i++; } else { ni++; i++; while (i > (1 + nj)) { i--; j++; arr[i][j] = a; a++; } nj++; goto star2; } arr[i][j] = a; a++; while (i > 0) { i--; j++; arr[i][j] = a; a++; } star2: ; } arr[n - 2][n - 1] = a; a++; arr[n - 1][n - 2] = a; a++; arr[n - 1][n - 1] = a; for (int u = 0; u < n; u++) { for (int v = 0; v < n; v++) { printf("%d ", arr[u][v]); } printf("\n"); } return 0; }
#include <stdio.h> int main() { int n,a[1005][1005],count=2; scanf("%d",&n); int row=1,col=1,ci=1;//ci指一次左斜下+一次右斜上 a[1][1]=1; while(count<=n*n){ for(int i=row,j=col+1;j>=1;i++,j--){ if(i<=n&&j<=n)a[i][j]=count++; } for(int i=row+2*ci,j=col-2*(ci-1);i>=1;i--,j++){ if(i<=n&&j<=n)a[i][j]=count++; } ci++; col+=2;//第一次循环原点(1,1),第二次循环原点(3,1),以此类推 } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++)printf("%d ",a[i][j]); printf("\n"); } return 0; }
#include <stdio.h> #include <stdlib.h> int main() { int num, sequence = 1, column; scanf("%d ", &num); int** arr = (int **)malloc(sizeof(int*) * num); for (int i = 0; i < num; i++) { arr[i] = (int*)malloc(sizeof(int) * num); } for (int sum = 0; sum <= 2 * (num - 1); sum++) { column = (sum > num - 1)?(sum + 1 - num):0; for (int i = column; i <= sum - column; i++) { if (sum % 2 == 0) { arr[sum - i][i] = sequence++; } else { arr[i][sum - i] = sequence++; } } } for (int i = 0; i < num; i++) { for (int j = 0; j < num; j++) { printf("%d ", arr[i][j]); } printf("\n"); } for (int i = 0; i < num; i++) { free(arr[i]); } free(arr); return 0; }
#include <stdio.h> int judegment(int arr[1000][1000], int i, int j, int n) { //判断是否在右上角 if(i == 0 && j == n - 1) return 0; //判断是否在左上角或右下角 else if((i == 0 && j == 0) || (i == n - 1 && j == n - 1)) return 1; //判断是否在数组首行或尾行 else if(i == 0 || i == n - 1) return 1; //判断是否在数组首列或尾列 else return 0; } int main() { int n; scanf("%d", &n); int arr[1000][1000] = { 0 }; int p = 1; int i = 0; int j = 0; arr[i][j] = p++; while(p <= n * n) { //判断向哪里移动一格 if(judegment(arr, i, j, n) == 1) { j++; arr[i][j] = p++; } else { i++; arr[i][j] = p++; } i++; j--; //向左下方移动 while(i < n && j >= 0) { arr[i][j] = p++; i++; j--; } i--; j++; //判断向哪里移动一格 if(judegment(arr, i, j, n) == 1) { j++; arr[i][j] = p++; } else { i++; arr[i][j] = p++; } i--; j++; //向右上方移动 while(i >= 0 && j < n) { arr[i][j] = p++; i--; j++; } i++; j--; } //打印数组 for(i = 0; i < n; i++) { for(j = 0; j < n; j++) { printf("%d ", arr[i][j]); } printf("\n"); } return 0; }
借鉴大佬思路
#include <stdio.h> int main() { int n = 0,k = 1; int i = 1,j = 1,i2 = 1,j2 = 1,i3 = 1,j3 = 1,i4 = 1,j4 = 1; int arr[1006][1006] = {0}; scanf("%d",&n); arr[1][1] = k++; while( k<=n*n) { i = 1,j = j4+1; for(i3 = i,j3 = j;j3>=1;i3++,j3--)//从右到左下 { if(j3<=n && j3>=1 && i3>=1 && i3<=n) arr[i3][j3]= k++; } i3--,j3++;//上面是j3>=1,所以会多减,去除多减的位置 i2 = i3+1,j2 = 1; for(i4 = i2,j4 = j2;i4>=1;i4--,j4++)//从下到右上 { if(j4>=1 && j4<=n && i4>=1 && i4<=n) arr[i4][j4] = k++; } i4++,j4--;//上面是i4>=1,所以会多减,去除多减的位置 } for(i = 1;i<=n;i++) { for(j = 1;j<=n;j++) { printf("%d ",arr[i][j]); } printf("\n"); } return 0; }
#include <stdio.h> int main() { int n; scanf("%d", &n); int a[n][n]; int i, j, z, count1 = 1; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { a[i][j] = 0; } } for (j = 0; j < n; j++) { if (j % 2 == 0) { z = 0; for (i = j; i >= 0; i--) { a[i][z] = count1; z++; count1++; } } else { z = j; for (i = 0; i <= j; i++) { a[i][z] = count1; z--; count1++; } } } int count2 = n * n; if (n % 2 == 0) { for (j = n - 1; j > 0; j--) { if (j % 2 == 0) { z = j; for (i = n - 1; i >= j; i--) { a[i][z] = count2; z++; count2--; } } else { z = n - 1; for (i = j; i < n; i++) { a[i][z] = count2; z--; count2--; } } } } else { for (j = n - 1; j > 0; j--) { if (j % 2 == 1) { z = j; for (i = n - 1; i >= j; i--) { a[i][z] = count2; z++; count2--; } } else { z = n - 1; for (i = j; i < n; i++) { a[i][z] = count2; z--; count2--; } } } } for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { printf("%d ", a[i][j]); } printf("\n"); } return 0; }
#include<stdio.h> int main() { int n, arr[1000][1000], cur = 0; scanf("%d", &n); int i = 0, j = 0;//i代表行,j代表列 for (int k = 0; k < n - 1; k++) { //循环次数n-1次 int b = j; for (i = 0; j < b + 2; j++) { //一次循环内的横向走向 if (j < n) arr[i][j] = ++cur; } for (i = 1, j = j - 2; j >= 0; i++, j--) { //右上到左下走向 if (i >= 0 && j >= 0 && j < n && i < n) arr[i][j] = ++cur; } for (j = 0; i > 0; i--, j++) { //左下到右上走向 if (i >= 0 && j >= 0 && j < n && i < n) arr[i][j] = ++cur; } } for (i = 0; i < n; i++) { for (j = 0; j < n; j++) printf("%d ", arr[i][j]); printf("\n"); } return 0; }
#include <stdio.h> int main(){ int n, arr[20][20]; scanf("%d", &n); int i, j = 0; int count = 0; arr[0][0] = ++count; while(count < n * n){ //每一轮拆解为 右/下 --> 斜下 --> 右/下 --> 斜上 if(j < n - 1)//右/下 j++; else i++; arr[i][j] = ++count; while(i < n - 1 && j > 0){ //斜下 i++; j--; arr[i][j] = ++count; } if(i < n - 1) //右/下 i++; else j++; arr[i][j] = ++count; while(i > 0 && j < n - 1){ //斜上 i--; j++; 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; }
#include<stdio.h> int main() { int n,a[100][100],count=1; scanf("%d",&n); int q=0; while(count<=n*n) { for(int i=q;i<=q+1;i++) if(i<n) a[0][i]=count++; for(int i=q,j=1;i>=0;i--,j++) if(i<n&&j<n) a[j][i]=count++; for(int i=q+2,j=0;i>0;i--,j++) if(i<n&&j<n) a[i][j]=count++; q+=2; } for(int i=0;i<n;i++) { for(int j=0;j<n;j++) printf("%d ",a[i][j]); printf("\n"); } return 0; }