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