首页 > 试题广场 >

回型矩阵

[编程题]回型矩阵
  • 热度指数:6731 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
给你一个整数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
#include<stdio.h>
int main()
{
    int arr[19][19] = {0},n,m,cur = 0;
    scanf("%d",&n);
    if(n == 1)
        printf("1\n");
    else
    {
        m = n;
        int count_left = 0,count_right = 0,i = 0,j = 0,count = n / 2;
        for(int k = 0;k < count;k++)
        {
            for(j = count_left;j < m - count_right - 1;j++)
                arr[i][j] = ++cur;
            for(i = count_left;i < n - count_right - 1;i++)
                arr[i][j] = ++cur;
            for(;j > count_left;j--)
                arr[i][j] = ++cur;
            for(;i > count_left;i--)
                arr[i][j] = ++cur;
            i += 1;
            count_left++;
            count_right++;
        }
        if(n % 2)
            arr[i][j + 1] = n*m;
        for(i = 0;i < n;i++)
        {
            for(j = 0;j < m;j++)
                printf("%d ",arr[i][j]);
            printf("\n");
        }   
    }
    return 0;
}

发表于 2022-08-04 15:53:56 回复(0)
#include<stdio.h>
int main()
{
    int n = 0;
    scanf("%d",&n);
    int i = 0;
    int a = n,b = 0;//上界左界、下界右界
    int flag = 1;
    int arr[19][19]={0};
    int x = 0,y = 0;
    for(i=1;i<=n*n;i++)
    {
        if(flag == 1)//往右走
        {
            arr[x][y]=i;
            y++;
        }
        else if(flag==2)//往下走
        {
            arr[x][y]=i;
            x++;
        }
        else if(flag==3)//往左走
        {
            arr[x][y]=i;
            y--;
        }
        else if(flag==4)//往上走
        {
            arr[x][y]=i;
            x--;
        }
        if(y==a-1&&x==b)//碰到右界,开始往下走
        {
            flag = 2;
        }
        else if(x==a-1&&y==a-1)//碰到下界,开始往左走
        {
            flag = 3;
        }
        else if(y==b&&x==a-1)//碰到左界,开始往上走,一圈完
        {
            flag = 4;
            b++;
            a--;
        }
        else if(x==b&&y==(b-1))//碰到上界,开始往右走
        {
            flag = 1;
        }
    }
    int j = 0;
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            printf("%d ",arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

发表于 2022-03-17 11:10:33 回复(3)
#include <stdio.h>

int main(){
    int n, i, a[20][20];
    scanf("%d", &n);
    int count = 0;
    int s = 0, f = n - 1;
    while(count < n * n){
        for(i = s; i <= f; i++)         //左 --> 右
            a[s][i] = ++count;
        for(i = s + 1; i <= f; i++)     //上 --> 下
            a[i][f] = ++count;
        for(i = f - 1; i >= s; i--)     //右 --> 左
            a[f][i] = ++count;
        for(i = f - 1; i >= s + 1; i--) //下 --> 上
            a[i][s] = ++count;
        s++;f--; //缩
    }
    for(i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

发表于 2022-06-08 12:00:46 回复(0)
#include <stdio.h>
int main()
{
	int arr[20][20];
	memset(arr, 0, sizeof(arr));
	int n = 0;
    int i = 0;
	int count = 1;
	scanf("%d", &n);
	int start = 0;
    int finish = n - 1;
	while (count <= n * n)
	{
		for (i = start; i <= finish; i++)
			arr[start][i] = count++;
		for (i = start + 1; i <= finish; i++)
			arr[i][finish] = count++;
		for (i = finish - 1; i >= start; i--)
			arr[finish][i] = count++;
		for (i = finish - 1; i >= start + 1; i--)
			arr[i][start] = count++;
		start++;
		finish--;
	}
	for (i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}


发表于 2022-08-17 12:26:34 回复(0)
#include<iostream>

int main() {
    int n;
    std::cin >> n;
    int arr[n][n];
    int l = -1, r = n - 1, u = 0, d = n - 1, val = 1;
    while (val <= n * n) {
        for (int i = ++l; i <= r; ++i) arr[u][i] = val++;
        for (int i = ++u; i <= d; ++i) arr[i][r] = val++;
        for (int i = --r; i >= l; --i) arr[d][i] = val++;
        for (int i = --d; i >= u; --i) arr[i][l] = val++;
    }
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) 
            printf("%d ", arr[i][j]);
        printf("\n");
    }
    return 0;
}

发表于 2022-03-30 21:22:16 回复(0)
#include <stdio.h>

int main() {
    int n;
    scanf("%d", &n);

    int left = 1, right = n, top = 1, down = n; //边界
    int x = 1, y = 1; //坐标
    int i;
    int arr[20][20];
    int directiontoleft = 0,directiontoright = 1, directionup = 0, directiondown = 0; //方向

    for (i = 1; i <= n * n; i++) {
        arr[x][y] = i;
        if (y == top && x != right && directiontoright ==1) {
            x += 1;
            if (x == right) { 
                directiontoright = 0;
                directiondown = 1;
                top += 1; 
            }
        }
        else if (x == right && y != down && directiondown == 1) {
            y += 1;
            if (y == down) { 
                directiondown = 0;
                directiontoleft = 1;
                right -= 1;
            }
        }
        else if (y == down && x != left && directiontoleft == 1) {
            x -= 1;
            if (x == left) { 
                directiontoleft = 0;
                directionup = 1;
                down -= 1;
            }
        }
        else if (x == left && y != top && directionup == 1) {
            y -= 1;
            if (y == top) { 
                directionup = 0;
                directiontoright = 1;
                left += 1; 
            }
        }
    }
    for (int j = 1; j <= n; j++) {
        for (int k = 1; k <= n; k++) {
            printf("%d ", arr[k][j]);
        }
        printf("\n");
    }
    return 0;
}

发表于 2024-02-12 09:49:41 回复(0)
import java.util.Scanner;
public class Main {
    public static void main(String [] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int[][] arr = new int[n+5][n+5];
        int r = n, d = 1, l = n, q = 1;
        int num = 1;
        while (num <= n * n) {
            for (int i = d; i <= r; i++) {
                arr[d][i] = num++;
            }
            d++;
            for (int i = d; i <= r; i++) {
                arr[i][r] = num++;
            }
            r--;
            for (int i = r; i >= q; i--) {
                arr[l][i] = num++;
            }
            l--;
            for (int i = l; i >= d; i--) {
                arr[i][q] = num++;
            }
            q++;
        }
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                System.out.print(arr[i][j] + " ");
            }
            System.out.println();
        }
    }

}

发表于 2023-09-19 14:12:48 回复(0)
#include <stdio.h>
int main()
{
    int n  = 0,k = 1,arr[20][20] = {0};
    scanf("%d",&n);
    int i = 0,i2 = 0,j = 0,j2 = 0,i3 = 0;
    for(i = 1;i<=n;i++)
    {
        for(j = i;j<=n;j++)//从左到右
        {
            if(arr[i][j]==0)
                arr[i][j] = k++;
            else//在需要的时候停下,并记录j
            {
                break;
            }
        }
        j--;//注意上面的j多走了一格
        for(i2 = i+1;i2<=n;i2++)//从上到下
        {
            if(arr[i2][j]==0)
                arr[i2][j] = k++;
            else//在需要的时候停下,并记录i2
            {
                break;
            }
        }
        i2--;//注意上面的i2多走了一格
        for(j2 = j-1;j2>=1;j2--)//从右到左
        {
            if(arr[i2][j2]==0)
                arr[i2][j2]=k++;
            else//在需要的时候停下,并记录j2
            {
                break;
            }
        }
        j2++;//注意上面的j2多走了一格
        for(i3 = i2-1;i3>i;i3--)//从下到上
        {
            if(arr[i3][j2]==0)
                arr[i3][j2] = k++;
            else//在需要的时候停下,并记录i3
            {
                break;
            }
        }
        i3++;//注意上面的i3多走了一格
    }
    for(i = 1;i<=n;i++)//输出
    {
        for(j = 1;j<=n;j++)
        {
            printf("%d ",arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

发表于 2023-03-16 20:43:26 回复(0)
#include <iostream>
#include <iomanip>
using namespace std;

void right(int n){
    for(int i=0;i<n;i++){
        
    }
}
int main()
{
    int n,val=1;
    cin>>n;
    if(n==1){//emmmm 特事特办
        cout<<'1';
        return 0;
    }
    int a[20][20];
    int i=0,j=0;
    for(int step=n-1,p=0;2*p<n;p++){//将回型矩形看成一个圈套一个圈,n为偶数,n/2圈,n为奇数剩一个数
        for(int q=0;q<step;q++){//向右:二维数组行(i)不变,列(j)递增
            a[i][j]=val;
            j++;
            val++;
        }
        for(int q=0;q<step;q++){//向下:二维数组行(i)递增,列(j)不变
            a[i][j]=val;
            i++;
            val++;
        }
        for(int q=0;q<step;q++){//向左:二维数组行(i)不变,列(j)递减
            a[i][j]=val;
            j--;
            val++;
        }
        for(int q=0;q<step;q++){//向右:二维数组行(i)递减,列(j)不变
            a[i][j]=val;
            i--;
            val++;
        }
        step-=2;//每完成一圈下一圈边长减二
        //调整下一圈起始位置
        i++;
        j++;
        while(!step){//补齐n为奇数时最后一个数
            if(n%2){
                a[i][j]=val;
                break;
            }
        }
    }
    i=0,j=0;//循环打印
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            cout<<a[i][j]<<" ";
        }
        cout<<endl;
    }
    //system("pause");
    return 0;
}

搜索

复制

发表于 2022-06-24 22:04:51 回复(0)
import sys

a = int(input())
a_list = [[0 for _ in range(a)] for _ in range(a)]
count = 1 # 开始数字
up = 0 # 上边界
left = 0 # 左边界
right = a-1 # 右边界
down = a-1 # 下边界
while count <= a*a:
    for i in range(left,right+1):  # 左到右,起点在左上
        a_list[up][i] = count
        count += 1
    up += 1 # 上边界下移(填充完成)
   
    for i in range(up,down+1): # 上到下,起点在右上
        a_list[i][right] = count
        count += 1
    right -= 1  # 右边界左移(填充完成)
   
    for i in range(right,left-1,-1): # 右到左,起点在右下
        a_list[down][i] = count
        count += 1
    down -= 1  # 下边界上移(填充完成)
   
    for i in range(down,up-1,-1): # 下到上,起点在左下
        a_list[i][left] = count
        count += 1
    left += 1  # 左边界右移(填充完成)

for i in range(a):
    print(' '.join(map(str,a_list[i])))
发表于 2024-03-02 08:39:05 回复(0)
#include <stdio.h>

int main() {
    int n,a[20][20],count=1;
    scanf("%d",&n);
    int col=0,row=0;//控制行和列
    while(count<=n*n){
        for(int i=col;i<n-col;i++)a[row][i]=count++;
        for(int j=row+1;j<n-row;j++)a[j][n-col-1]=count++;
        for(int i=n-col-2;i>=col;i--)a[n-row-1][i]=count++;
        for(int j=n-row-2;j>row;j--)a[j][col]=count++;
        col++;
        row++;//以一圈为一次循环
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++)printf("%d ",a[i][j]);
        printf("\n");
    }
    return 0;
}

编辑于 2024-01-14 21:57:05 回复(0)
#include <stdio.h>
#include <stdlib.h>
void clock_Wise(int p[][19], int left, int right, int serialNum);

int main() {
    int n, count = 1;
    scanf("%d", &n);
    int arr[19][19];
    clock_Wise(arr, 0, n - 1, 1);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

void clock_Wise(int p[][19], int left, int right, int serialNum){
    int row = left, column = left;
    if(left < right){
        for(; column < right; column++){
            p[row][column] = serialNum++;
        }
        for(; row < right; row++){
            p[row][column] = serialNum++;
        }
        for(; column > left; column--){
            p[row][column] = serialNum++;
        }
        for(; row > left; row--){
            p[row][column] = serialNum++;
        }
        clock_Wise(p, left + 1, right - 1, serialNum);
    } else if (left == right) {
        p[row][column] = serialNum;
    }
}

发表于 2024-01-03 16:33:22 回复(0)
#include<stdio.h>
int main(){
    int a;
    scanf("%d",&a);
    int an[a][a];
    int l=0;
    int p=1;
    while(1){
        /*上*/
        for(int n=l;n<a-l-1;n++){
            an[l][n]=p;
            p++;
        }
       
        /*右*/
        for(int n=l;n<a-l-1;n++){
            an[n][a-l-1]=p;
            p++;
        }
        /*下*/
        for(int n=a-l-1;n>l;n--){
            an[a-l-1][n]=p;
            p++;
        }
        /*左*/
        for(int n=a-l-1;n>l;n--){
            an[n][l]=p;
            p++;
        }
        if(p>a*a){
            break;
        }
        l++;
        if(p==a*a&&a%2!=0){
            an[a/2][a/2]=a*a;
            break;
        }
    }
    for(int b=0;b<a;b++){
        for(int c=0;c<a;c++){
            printf("%d ",an[b][c]);
        }
        printf("\n");
    }
   
   
   
    return 0;
}
发表于 2023-12-26 16:29:28 回复(0)
package main

import (
    "fmt"
)

func main() {
    var n int
    fmt.Scan(&n)
    matrix := make([][]int, n)
    for i := 0; i < n; i++ {
        matrix[i] = make([]int, n)
    }
    x := 1
    l, r, u, d := 0, n-1, 0, n-1
    for x <= n*n {
        // 向右走
        for i := l; i <= r; i++ {
            matrix[u][i] = x
            x++
        }
        // 向下走
        for i := u+1; i <= d; i++ {
            matrix[i][r] = x
            x++
        }
        // 向左走
        for i := r-1; i >= l; i-- {
            matrix[d][i] = x
            x++
        }
        // 向上走
        for i := d-1; i > u; i-- {
            matrix[i][l] = x
            x++
        }
        l, r, u, d = l+1, r-1, u+1, d-1
    }
    for i := 0; i < n; i++ {
        for j := 0; j < n; j++ {
            fmt.Printf("%d ", matrix[i][j])
        }
        fmt.Println()
    }
}
编辑于 2023-12-24 04:09:58 回复(0)
#include <stdio.h>
void generatespiralMatrix(int n)
{
    int Matrix[19][19];
    int left=0,right=n-1,top=0,bottom=n-1,value=1;
    while(left<=right&&top<=bottom)
    {
        //从左到右
        for(int i=left;i<=right;i++)
        {
            Matrix[top][i]=value++;
        }
        top++;
        //从上到下
        for(int i=top;i<=bottom;i++)
        {
            Matrix[i][right]=value++;
        }
        right--;
        //从右到左
        for(int i=right;i>=left;i--)
        {
            Matrix[bottom][i]=value++;
        }
        bottom--;
        //从下到上
        for(int i=bottom;i>=top;i--)
        {
            Matrix[i][left]=value++;
        }
        left++;
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            printf("%d ",Matrix[i][j]);
        }
        printf("\n");
    }

}
int main() {
    int n;
    scanf("%d",&n);
    generatespiralMatrix(n);
    return 0;
}
发表于 2023-12-21 21:29:47 回复(0)
#include<stdio.h>

int n=0;
int tmp=0;
int count=0;

void ReturnMatrix(int (*arr)[n],int StartRow,int StartCol,int EndRow,int EndCol)
{
    if(StartRow>EndRow||StartCol>EndCol)
        return;

    for(int j=StartCol;j<=EndCol;j++)
        arr[StartRow][j]=tmp+j+1-count;
    for(int i=StartRow+1;i<=EndRow;i++)
        arr[i][EndCol]=arr[StartRow][EndCol]+i-count;
    for(int j=EndCol-1;j>=StartCol;j--)
        arr[EndRow][j]=arr[EndRow][EndCol]+n-j-1-count;
    for(int i=EndRow-1;i>=StartRow+1;i--)
        arr[i][StartCol]=arr[EndRow][StartCol]+n-i-1-count;

    tmp=arr[StartRow+1][StartCol];
    count++;
    ReturnMatrix(arr,StartRow+1,StartCol+1,EndRow-1,EndCol-1);
}

int main()
{
    scanf("%d",&n);
    int arr[n][n];
    ReturnMatrix(arr,0,0,n-1,n-1);

    for(int i=0;i<n;i++)
    {
        for (int j = 0; j < n; j++)
            printf("%d ",arr[i][j]);
        printf("\n");
    }

    return 0;
}
发表于 2023-11-02 21:55:50 回复(1)

#include <stdio.h>
int main()
{
    int N,n,num=1;
    int a[20][20]={0};
    scanf("%d",&N);
    if(N%2!=0)
        a[N/2][N/2]=N*N;
    for(int n=0;n<N/2;n++)
    {
        for(int j=n;j<N-n-1;j++)
        {
            a[n][j]=num++;
        }
        for(int i=n;i<N-n-1;i++)
        {
            a[i][N-n-1]=num++;
        }
        for(int j=N-n-1;j>=n+1;j--)
        {
            a[N-n-1][j]=num++;
        }
        for(int i=N-n-1;i>=n+1;i--)
        {
            a[i][n]=num++;
        }
    }
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<N;j++)
        {
            printf("%5d",a[i][j]);
        }
        puts("\n");
    }
    return 0;
}

发表于 2023-10-08 21:21:52 回复(0)
#include <stdio.h>
//太难了
void test(int arr[19][19], int n, int* l, int* count)
{
    int d = 1;
    int i = 0;
    int a = 1;
    int j = 0;
    int b = 1;
    int c = 1;
    for (i = 0+ *l; i < n+ *l; i++)
    {
        if (*l ==0)
        {
            if (i == 0)
            {
                for (j = 0 + *l; j < n; j++)
                {
                    if (j == 0 + *l)
                    {
                        arr[i][j] = arr[0][0];
                    }
                    else if (j >= 1 && j <= n - 1)
                    {
                        arr[i][j] = arr[i][j - 1] + d;
                    }
                }
            }
            else if (i >= 1  && i <= n -2)
            {
                int z = n - 1;
                arr[i][z] = arr[0][n - 1] + a;
                a++;
            }
            while (i == n - 1 && n>=2)
            {
                int k = 0;
                for (k = n - 1; k >= 0; k--)
                {
                    arr[i][k] = arr[n - 2][n - 1] + b;
                    b++;
                }
                int t = 0;
                for (t = n - 2; t > 0; t--)
                {
                    arr[t][0] = arr[n - 1][0] + c;
                    c++;
                }
                (*l)++; 
                if (i == n - 1)
                {
                    break;
                }
            }
            if (i == n - 1)
            {
                break;
            }
        }
        else if (*l != 0)
        {
            if (i == *l)
            {
                for (j = 0 + *l; j < n + *l; j++)
                {
                    if (j == *l)
                    {
                        arr[i][j] = arr[i][i - 1] + 1;
                    }
                    else if (j >= 1 + *l && j <= n + *l - 1)
                    {
                        arr[i][j] = arr[i][j - 1] + d;
                    }
                }
            }
                if (n - 2 > 0)
                {
                    if ((i >= 1 + *l && i <= n - 3 + (*count)))
                    {
                        int z = 0;//7-6 5-5 3-4      6-5 4-4 2-3
                        z = n - 2 +(*count);
                        arr[i][z] = arr[*l][z] + a;
                        a++;
                    }
            }
            while (i == n-2+(*count))//2->1 4->2 6->3 8->4   10-9 8-8 6-7 4-6 2-5
            {
                int k = 0;
                if (n >= 2)
                {
                    for (k = n - 2 + (*count); k >= *count - 1; k--)
                    {
                        arr[i][k] = arr[n - 3 + (*count)][n - 2 + (*count)] + b;// 4-3 2-3
                        b++;
                    }
                }
                else
                {
                    arr[i][i] = arr[i][i - 1]+1;
                }
                if (n > 2 )
                {
                    int t = 0;
                    for (t = n - 3 + *count; t > *l; t--)//5-4\3 3-3
                    {
                        arr[t][0 + *l] = arr[n-2+*count][0 + *l] + c;
                        c++;
                    }
                }
                (*l)++;
                if (i == n - 2 + (*count))
                {
                    break;
                }
            }
            if (i == n - 2 + (*count))
            {
                break;
            }
        }     
    }
    if ((n - 2) > 0)
    {
        (*count)++;
        test(arr, n - 2, l,count);
    }
    
}


int main()
{
    int count = 1;
    int l = 0;
    int arr[19][19] = { 0 };
    arr[0][0] = 1;
    int n = 0;
    scanf("%d", &n);
    test(arr, n, &l, &count);
    int v = 0;
    for (v = 0; v < n; v++)
    {
        int h = 0;
        for (h = 0; h < n; h++)
        {
            printf("%d ", arr[v][h]);
        }
        printf("\n");
    }
    
    return 0;
}

发表于 2023-09-06 12:24:33 回复(0)
package main

import (
    "fmt"
)

func main() {
    var m, up, down, left, right, x, y, flag int
    var arr [20][20]int
    fmt.Scan(&m)
    x, y,up = 0, 0,0

    left = -1
    down, right = m-1, m-1
    for i := 1; i <= m*m; i++ {
        switch flag {
        case 0: //→→→→→→→→→→→→
            arr[x][y] = i
            y++
        case 1: //↓↓↓↓↓↓↓↓↓↓↓↓
            arr[x][y] = i
            x++
        case 2: //←←←←←←←←←←←←
            arr[x][y] = i
            y--
        case 3: //↑↑↑↑↑↑↑↑↑↑↑
            arr[x][y] = i
            x--
        }
        switch {
        case x == up && y == right:
            flag = 1
            left++
        case x == down && y == right:
            flag = 2
            up++
        case x == down && y == left:
            flag = 3
            right--
        case x == up && y == left:
            flag = 0
            down--
        }
    }
    for i := 0; i < m; i++ {
        for j := 0; j < m; j++ {
            fmt.Printf("%d ", arr[i][j])
        }
        fmt.Println()
    }
}
发表于 2023-08-09 18:03:21 回复(0)
#include <stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    int arr[100][100] = {0};
    int count = 0;
    int x,y,i;
    x = 0;
    y = n-1;
    while(count<n*n)
    {
        for(i = x;i<=y;i++)
    {
        arr[x][i] = count+1;
    }
    for(i = x+1;i<=y;i++)
    {
        arr[i][y] = count+1;
    }
    for(i = y-1;i>=x;i--)
    {
        arr[y][i] = count+1;
    }
    for(i = y-1;i>x;i--)
    {
        arr[i][x] = count+1;
    }
    ++x;
    --y;
    }
    for(i = 0;i<n;i++)
    {
        for(int j = 0;j<n;j++)
        {
            printf("%d ",arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}
发表于 2023-06-01 21:51:16 回复(0)