#include <stdio.h> int main() { int n; scanf("%d", &n); int count = 1; int row = 0; int col = 0; int arr[1000][1000] = {0}; while(count <= n*n) { for(int i=0; i<2; i++) { if(row<n && col<n) arr[row][col] = count++; col++; } col--; while(col) { row++; col--; if(row<n && col<n) arr[row][col] = count++; } row++; while(row) { if(row<n && col<n) arr[row][col] = count++; row--; col++; } } for(int i=0; i<n; i++) { for(int j=0; j<n; j++) printf("%d ", arr[i][j]); printf("\n"); } return 0; }
import java.util.*; public class Main{ public static void main(String[] args){ Scanner in=new Scanner(System.in); int n=in.nextInt(); int[][] a=new int[n][n]; int z=0,i=0,j=0; while(z<n*n){ for(j=0;i>=0;i--,j++) if(i<n && j<n) a[i][j]=++z; for(i=0;j>=0;i++,j--) if(i<n && j<n) a[i][j]=++z; } for(int[] k:a) { for (int p : k) System.out.print(p + " "); System.out.println(); } 比较简单
#include<stdio.h> int main() { int n; scanf("%d",&n); int arr[1001][1001]={0}; arr[0][0]=1; int count=2; int pos=1;//1表示右上,-1表示左下 int i=0,j=0;//i表示行,j表示列 while(count<=n*n) { //先判定四种情况 if(i==0&&j<n-1&&pos==1)//上边界,行不变,列增加 { arr[i][++j]=count++; pos=-1;//改变方向 } else if(i<n-1&&j==0&&pos==-1)//左边界,行增加,列不变 { arr[++i][j]=count++; pos=1; } else if(i<n-1&&j==n-1&&pos==1)//右边界,行增加,列不变 { arr[++i][j]=count++; pos=-1; } else if(i==n-1&&j<n-1&&pos==-1)//下边界,行不变,列增加 { arr[i][++j]=count++; pos=1; } else if(pos==1)//右上 { arr[--i][++j]=count++; } else if(pos==-1)//左下 { arr[++i][--j]=count++; } } for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { printf("%d ",arr[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> //拐弯分为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; scanf("%d", &n); int s[n][n]; int i; int x = 0, y = 0; //数组元素的坐标 int flag; //斜走方式:1为向右上,0为向左下 int min = 0, max = n-1; //边缘位置 i = 1; s[x][y] = i++; while ( i <= n*n ) { if ( x == min && y < max ) { //斜走完成后在上边缘,向右走 y++; //右上角除外,且修改斜走方式为向左下 flag = 0; } else if ( y == max && x < max ) { //斜走完成后在右边缘,向右走 x++; //右下角除外,且修改斜走方式为向左下 flag = 0; } else if ( y == min && x < max && x > 0 ) { //斜走完成后在左边缘,向右走 x++; //左上,左下角除外,且修改斜走方式为向右上 flag = 1; } else if ( x == max && y < max ) { //斜走完成后在右方,向右走 y++; //右下角除外,且修改斜走方式为向右上 flag = 1; } s[x][y] = i++; if ( flag == 0 ) { while ( y > min && x < max ) { //左下走,直到碰到边缘 x++; y--; s[x][y] = i++; } } else { //右上走,直到碰到边缘 while ( x > min && y < max ) { x--; y++; s[x][y] = i++; } } } for ( i = 0; i < n; i++ ) { //打印数组 for ( int j = 0; j < n; j++ ) { printf("%d ", s[i][j]); } printf("\n"); } }
#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 <iostream> #include <vector> using namespace std; int main(){ int n; cin>>n; vector<vector<int>> arr(n,vector<int>(n)); int row,start,flag=-1,num=1; for(int i=0;i<2*n-1;i++){ row=min(i,n-1);//row表示行能到达的最大,i-row就表示列能到达的最大 start=(flag==-1?row:(i-row));//统一,但是不能用row表示,因为下面for判断还是用row,就搞混了 for(int j=start;(i-j)<=row&&j<=row;j+=flag){ arr[j][i-j]=num++; } // if(flag==1){//不统一 // for(int j=row;i-j<=row;j--){//表示从左下到右上的过程 // arr[j][i-j]=num++; // } // }else{ // for(int j=i-row;j<=row;j++){//表示从右上到左下的过程 // arr[j][i-j]=num++; // } // } flag=-flag; } for(int i=0;i<n;i++){ for(int j=0;j<n;j++) cout<<arr[i][j]<<' '; cout<<endl; } return 0; }
#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> int main() { int n; scanf("%d", &n); int array[n + 1][n + 1]; array[1][1] = 1; int i=1, j=1, k=0, pos = 1; for (k = 2; k <= n * n; k++) { if (i == 1 && j < n && pos == 1) { array[i][++j] = k; pos = -1; } else if (j == 1 && i < n && pos == -1) { array[++i][j] = k; pos = 1; } else if (i == n && pos == -1) { array[i][++j] = k; pos = 1; } else if (j == n && pos == 1) { array[++i][j] = k; pos = -1; } else if (pos == 1) { array[--i][++j] = k; } else if (pos == -1) { array[++i][--j] = k; } } for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) printf("%d ", array[i][j]); printf("\n"); } return 0; }
n = int(input()) # map函数用法 arr = [ ['']*n for _ in range(n)] i = 0 # 行索引 j = 0 # 列索引 count = 1 # 元素值 arr[i][j] = count # 按蛇形路线确定循环一个周期的的开始 while True: # 矩阵最上方只能 右移或下移 if j+1 < n: # 右移 j += 1 count += 1 arr[i][j] = count else : if i+1 < n: # 下移 i += 1 count += 1 arr[i][j] = count while True: if i+1 < n and 0 <= j-1 : # 左下 i += 1 j -= 1 count += 1 arr[i][j] = count elif i+1 < n : # 全部左下后,能下移一格,则执行 i += 1 count += 1 arr[i][j] = count #下移一格后,右上,全部右上后,抵达周期的开始,break结束最近的 while for _ in range(i): if 0 <= i-1 and j+1 < n: # 右上 i -= 1 j += 1 count += 1 arr[i][j] = count break elif j+1 < n: # 全部左下后,不能下移一格,则判断能否向右一格 j += 1 count += 1 arr[i][j] = count # 右上,全部右上后,抵达周期的开始,break结束最近的 while for _ in range(i): if 0 <= i-1 and j+1 < n: # 右上 i -= 1 j += 1 count += 1 arr[i][j] = count break if i==j and i+1==n: break for i in arr: print(*i)
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int[][] nums = new int[n][n]; int count = 0; //矩阵数字 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) nums[i][j] = ++count; } for (i = 1, j = j - 2; j >= 0; i++, j--) { //右上到左下走向 if (i >= 0 && j >= 0 && j < n && i < n) nums[i][j] = ++count; } for (j = 0; i > 0; i--, j++) { //左下到右上走向 if (i >= 0 && j >= 0 && j < n && i < n) nums[i][j] = ++count; } } for (int k = 0; k < n; k++) { for (int l = 0; l < n; l++) { System.out.print(nums[k][l] + " "); } System.out.println(); } } }
#include <stdio.h> int main() { int n=0; scanf("%d",&n); int arr[1001][1001]={0}; int i=1,j=1,k=0,pos=1; arr[i][j]=1; for(k=2;k<=n*n;k++) { if(i==1&&j<n&&pos==1) { arr[i][++j]=k; pos=-1; } else if(j==1&&i<n&&pos==-1) { arr[++i][j]=k; pos=1; } else if(j==n&&pos==1) { arr[++i][j]=k; pos=-1; } else if(i==n&&pos==-1) { arr[i][++j]=k; pos=1; } else if(pos==1) { arr[--i][++j]=k; } else if(pos==-1) { arr[++i][--j]=k; } } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { printf("%d ",arr[i][j]); } printf("\n"); } return 0; }