首页 > 试题广场 >

回型矩阵

[编程题]回型矩阵
  • 热度指数:9117 时间限制: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, 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 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 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)
int main()
{
	int arr[50][50] = {0};
	int n = 0;
	scanf("%d",&n);
	int a = 1;
	int i = 0;
	int left = 0;int right = n-1;
	while (a<=n*n)
	{
		for (i = 0; i < n; i++)
		{
			if (arr[left][i] == 0)
			{
				arr[left][i] = a++;
			}
			
		}
		for (i = 1; i <= n - 2; i++)
		{
			if (arr[i][right] == 0)
			{
				arr[i][right] = a++;
			}

		}
		for (i = n - 1; i >= 0; i--)
		{
			if (arr[right][i] == 0)
			{
				arr[right][i] = a++;
			}
		}
		for (i = n - 2; i >= 1; i--)
		{
			if (arr[i][left] == 0)
			{
				arr[i][left] = a++;
			}
		}
		left++;
		right--;
	}

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

	return 0;
}

发表于 2024-08-14 17:36:46 回复(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)
#include <stdio.h>
void right(int* k) {
    (*k)++;
}
void left(int* k) {
    (*k)--;
}
void down(int* j) {
    (*j)++;
}
void up(int* j) {
    (*j)--;
}
void turn(int* sign, int* j, int* k) {
    switch (*sign) {
        case 1:
            right(k);
            break;
        case 2:
            down(j);
            break;
        case 3:
            left(k);
            break;
        case 4:
            up(j);
            break;
    }
}
void corn(int* sign, int* n, int* j, int* k, int* x) {
    if (*sign == 1 && *k == *n - 1 - *x) {
        (*sign)++;
    } else if (*sign == 2 && *j == *n - 1 - *x) {
        (*sign)++;
    } else if (*sign == 3 && *k == *x) {
        (*sign)++;
        (*x)++;
    } else if (*sign == 4 && *j == *x) {
        (*sign) = 1;
    }
}

int main() {
    int n, j = 0, k = 0, sign = 1, x = 0;
    scanf("%d", &n);
    int temp = n;
    int arr[temp][temp];
    for (int i = 1; i <= n * n; i++) {
        arr[j][k] = i;
        turn(&sign, &j, &k);
        corn(&sign, &n, &j, &k, &x);
    }
    for (int i = 0; i < temp; i++) {
        for (int j = 0; j < temp; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}
发表于 2025-09-16 15:11:18 回复(0)
#include <stdio.h>

int main() {
    int a, b[20][20]={},c;
    scanf("%d\n",&a);
    int d,e,k=1,sum=1,aa=1,ab=a,ac=1,ad=a,i=1,j=1;
   
    while(sum<=a*a){
        for(i=aa;i<=ab;i++){
            b[aa][i]=sum;
            sum++;
        }
        for(i=aa+1;i<=ab;i++){
            b[i][ab]=sum;
            sum++;
        }
        for(i=ab-1;i>=aa;i--){
            b[ab][i]=sum;
            sum++;
        }
        for(i=ab-1;i>=aa+1;i--){
            b[i][aa]=sum;
            sum++;
        }
        aa++;
        ab--;
       
    }
    int x,y;
    for(x=1;x<=a;x++){
        for(y=1;y<=a;y++){
            printf("%d ",b[x][y]);
        }
        printf("\n");
    }
    return 0;
}
发表于 2025-08-11 00:36:21 回复(0)
#include <stdio.h>

int main() 
{
    int n = 0;
    scanf("%d" ,&n);
    int arr[20][20] = {0};
    int x = 0,y = 0;
    int a = 0, b= n-1, c = n-1, d = -1;
    int i = 1;
    while( i <= n*n)
    {
        arr[x][y] = i;
        i++;

        if( x == a && y < b)
        {
            if(y == d)
            {
                c--;
            }
            y++;
        }
        else if( y == b && x < c)
        {
            if( x == a)
            {
                d++;
            }
            x++;
        }
        else if( x == c && y > d)
        {
            if(y == b)
            {
                a++;
            }
            y--;
        }
        else if( y == d && x >a)
        {
            if(x == c)
            {
                b--;
            }
            x--;
        }
       
    }


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

发表于 2025-05-06 13:49:23 回复(0)
#include <stdio.h>

int main() {
    int n;
    int a[20][20];
    scanf("%d", &n);
    //根据n计算要输入的总次数,在循环中设置转弯条件
    // 转弯条件:当前方向前方和后方和当前位置的总长度等于n,就转向
    // 四个边,都有宽度,走在哪一条边,哪条边就宽度加1
    // 还有四个标志,表示当前方向,可以用一个变量表示方向,用switch语句调转
    int direction = 1; // 1右 2下 3左 4上
    int up = 0, down = 0, right = 0, left = 0;
    int x=0, y=0;
    for(int times = 1; times <= n*n;){
        switch (direction) {
        case 1:{
            up++;
            for(int i = 0; left + right + i < n;){
                a[x][y] = times;    //输入
                i++;                //记录已走路程
                times++;
                if(left + right + i == n){
                    direction = 2;
                    x++;
                    break;
                }                   //走到头,要转向了
                y++;
            }
            break;
        }
        case 2:{
            right++;
            for(int i = 0; up + down + i < n;){
                a[x][y] = times;    //输入
                i++;                //记录已走路程
                times++;
                if(up + down + i == n){
                    direction = 3;
                    y--;
                    break;
                }
                x++;
            }
            break;
        }
        case 3:{
            down++;
            for(int i = 0; right + left + i < n;){
                a[x][y] = times;    //输入
                i++;                //记录已走路程
                times++;
                if(right + left + i == n){
                    direction = 4;
                    x--;
                    break;
                }
                y--;
            }
            break;
        }
        case 4:{
            left++;
            for(int i = 0; down + up + i < n;){
                a[x][y] = times;    //输入
                i++;                //记录已走路程
                times++;
                if(down + up + i == n){
                    direction = 1;
                    y++;
                    break;
                }
                x--;
            }
            break;
        }
        };
    }
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

发表于 2025-04-18 16:59:55 回复(0)
void huiwen(int arr[][19], int n) {
//最外圈为1 ~ 4*(n - 1),次外圈为4*(n - 1) + 1 ~ 4*(n - 1) + 4*(n - 2 - 1)……共有(n + 1) / 2圈
    int cnt = 0, i = 0, j = 0, num = 0;
    while (cnt != (n + 1) / 2) {
        for (i = 0 + cnt; i < n - cnt - 1; i++) {
            num++;
            arr[0 + cnt][i] = num;
        }
        for (i = 0 + cnt; i < n - cnt - 1; i++) {
            num++;
            arr[i][n - cnt - 1] = num;
        }
        for (i = n - cnt - 1; i > 0 + cnt; i--) {
            num++;
            arr[n - 1 - cnt][i] = num;
        }
        for (i = n - cnt - 1; i > 0 + cnt; i--) {
            num++;
            arr[i][0 + cnt] = num;
        }
        cnt++;
    }
    if (n % 2 == 1) {
        arr[(n + 1) / 2 - 1][(n + 1) / 2 - 1] = n * n;
    }
    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[19][19] = { 0 };
    huiwen(arr, n);
    return 0;
}
发表于 2025-01-10 22:31:35 回复(0)
#include<stdio.h>
void Return_matrix(int arr[20][20], int n)
{
    int top = 0;
    int bottom = n-1;
    int left = 0;
    int right = n-1;
    int i = 0;
    int j = 0;
    int sum = 1;
    while(sum<=n*n)
    {
      for(j=left;j<=right;j++)
      {
         arr[i][j]=sum;
         sum++;
         if(j==right)
         break;
      }
      top++;
      right--;
      for(i=top;i<=bottom;i++)
      {
         arr[i][j]=sum;
         sum++;
         if(i==bottom)
         break;
      }
      bottom--;
      for(j=right;j>=left;j--)
      {
        arr[i][j]=sum;
         sum++;
         if(j==left)
         break;
      }
      left++;    
      for(i=bottom;i>=top;i--)
      {
        arr[i][j]=sum;
        sum++;
        if(i==top)
        break;
      }
    }

}
int main()
{
    int n = 0;
    int i = 0;
    int j = 0;
    scanf("%d",&n);
    int arr[20][20]={0};
    Return_matrix(arr,n);
     for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            printf("%d ",arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

发表于 2025-01-02 10:54:37 回复(0)
#include <stdio.h>

int main() {
   int n;
   scanf("%d",&n);
   int i,j,k;
   int array[n][n];
   int left=0,right=n-1,top=0,bottom=n-1,num=1;
   while(left<=right&&top<=bottom){
    for(int i=left;i<=right;i++){
        array[top][i]=num++;
    }
    top++;
    for(int i=top;i<=bottom;i++){
        array[i][right]=num++;
    }
    right--;
    for(int i=right;i>=left;i--){
        array[bottom][i]=num++;
    }
    bottom--;
    for(int i=bottom;i>=top;i--){
        array[i][left]=num++;
    }
    left++;
   }
   for(i=0;i<n;i++)
   {
    for(j=0;j<n;j++)
    {
        printf("%d ",array[i][j]);  
    } 
    printf("\n");
   }
    return 0;
}

发表于 2024-10-02 14:53:00 回复(0)
n = int(input())
arr =  [ ['']*n for _ in range(n)]
value = 1
i = 0
j = n
while True:
    for x in range(i,j+i):
        arr[i][x] = value
        value += 1
    for y in range(1+i,j+i):
        arr[y][j-1+i] = value
        value += 1
    for y in range(j-1,0,-1):
        arr[j-1+i][y-1+i] = value
        value += 1

    for y in range(j-2,0,-1):
        arr[y+i][i] = value
        value += 1
    j -= 2
    i += 1
    if j<0:
        break
for i in arr:
    print(*i)
    # for j in i:
    #     tem = j if j else "*"
    #     print(f"{tem:<3}",end="")

发表于 2024-09-29 22:43:29 回复(0)
#include <stdio.h>

int main() {
    int a, b,x=0,y=0,shu=1;
    scanf("%d",&a);
    int chan[a][a];
    b=a;
    for (int n=0; n<b; n++) {
        chan[x][y]=shu;
        y++;
        shu++;
    }
    y--;
    for (int n=0; n<a/2; n++) {
        b--;

        for (int j=0; j<b; j++) {
            x++;
            chan[x][y]=shu;
            shu++;

        }
        
        for (int j=0; j<b; j++) {
            y--;
            chan[x][y]=shu;
            shu++;
        }
        b--;
        
        for (int j=0; j<b; j++) {
            x--;
            chan[x][y]=shu;
            shu++;
        }
        for (int j=0; j<b; j++) {
            y++;
            chan[x][y]=shu;
            shu++;
        }
        
    }
    for (int m=0; m<a; m++) {
        for (int n=0; n<a; n++) {
            printf("%d ",chan[m][n]);
        }
        printf("\n");
    }
    return 0;
}

发表于 2024-09-28 17:32:29 回复(0)
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 a = 0, b = n - 1; //矩阵位置
        while (count < n * n) {
            for (int i = a; i <= b; i++) { //左--》右
                nums[a][i] = ++count;
            }
            for (int i = a + 1; i <= b; i++) { // 上--》下
                nums[i][b] = ++count;
            }
            for (int i = b - 1; i >= a; i--) { // 右--》左
                nums[b][i] = ++count;
            }
            for (int i = b - 1; i >= a + 1; i--) { //下--》上
                nums[i][a] = ++count;
            }
            a++;
            b--;//逐渐收缩
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                System.out.print(nums[i][j] + " ");
            }
            System.out.println();
        }
    }
}

发表于 2024-09-06 10:25:42 回复(0)

问题信息

上传者:牛客301599号
难度:
49条回答 3006浏览

热门推荐

通过挑战的用户

查看代码
回型矩阵