#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;
}