1050 螺旋矩阵 (25分)

VS2019堆栈溢出---定义了过大的数组,运行程序弹出chkstk.asm的解决方法

用new定义数组

首先要算出合适的m,n——行、列数

附:几个特殊的测试点,输入3个数、27个数、11个数

然后new一个二维数组,将给出的数套进去,

i=0;j=0;光标先向右,再向下,再向左,再向上,再向右...如何循环

给出四周的边界数——top = 0, left = -1, right = n, down = m;

再给出当前的轨迹方向—— r = 1, l = 0, up = 0, d = 0; (右左上下,1为当前轨迹方向)

如何退出循环,定义一个sum,统计当前已定好位置的数的个数,当sum == num时flag = 0,退出循环!

#include<iostream>
#include<algorithm>
#include<cmath>

using namespace std;

int main() {
	int num, i,j,k;
	int m, n;

	cin >> num;
	//new一个number数组
	int* arr = new int[num];

	for (i = 0; i < num; i++) {
		cin >> arr[i];
	}
	sort(arr, arr + num); // 降序排列
	//获得m,n行列
	n = abs(sqrt(num));

	while (num % n != 0) {
		n--;
	}
	m = num / n;
	//new一个二维数组
	int **a;
	a = new int *[m];
	for (i = 0; i < m; i++) {
		a[i] = new int[n];
	}
	k = num - 1;
	int size = num;
	int top = 0, left = -1, right = n, down = m;
	int r = 1, l = 0, up = 0, d = 0; // 光标左右上下
	i = 0, j = 0;
	int flag = 1, sum = 0;
	while (flag) {

		if (r) {
			if (sum == num) {
				flag = 0; break;
			}
			//0 1 2
			if (j < right) {
				a[i][j++] = arr[k--];
				sum++;
			}
			if (j == right) {
				i++; right--; j = right;
				r = 0; d = 1;
			}
		}
		if (d) {
			if (sum == num) {
				flag = 0; break;
			}
			if (i < down) {
				a[i++][j] = arr[k--];
				sum++;
			}
			if (i == down) {
				j--; down--; i = down;
				l = 1; d = 0;
			}
		}
		if (l) {
			if (sum == num) {
				flag = 0; break;
			}
			if (j > left) {
				a[i][j--] = arr[k--];
				sum++;
			}
			if (j == left) {
				i--; left++; j = left;
				up = 1; l = 0;
			}
		}
		if (up) {
			if (sum == num) {
				flag = 0; break;
			}
			if (i > top) {
				a[i--][j] = arr[k--];
				sum++;
			}
			if (i == top) {
				j++; top++; i = top;
				up = 0; r = 1;
			}
		}

	}
	for (i = 0; i < m; i++) {
		for (j = 0; j < n; j++) {
			cout << a[i][j];
			if (j < n - 1) {
				cout << " ";
			}
		}
		cout << endl;
	}

	return 0;
}

再附一个网上的,似乎简单些,但我脑子不够用,还是用自己的笨方法吧,(* ̄︶ ̄)

// 1050 螺旋矩阵 (25 分).cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
int main()
{
    //输入
    int num;
    cin >> num;
    int a[num];
    int tmp;
    for (int i = 0; i < num; i++) {
        cin >> tmp;
        a[i] = tmp;
    }
    //排序
    sort(a, a + num);
    //求出行列数
    int hang, lie;
    lie = sqrt(num);
    while (num % lie) lie--;
    hang = num / lie;
    //循环打印即可
    int t[hang][lie];
    int index = 0;
    for (int side = 0, k = num - 1; side * 2 < lie; side++) {
        for (int j = side; j < lie - side; j++) {
            t[side][j] = a[k--];
        }
        for (int i = side + 1; i < hang - side; i++) {
            t[i][lie - 1 - side] = a[k--];
        }
        for (int j = lie - 2 - side; j >= side; j--) {
            t[hang - 1 - side][j] = a[k--];
        }
        if (lie - 1 - side > side) {
            for (int i = hang - 2 - side; i >= side + 1; i--) {
                t[i][side] = a[k--];
            }
        }
    }
    for (int i = 0; i < hang; i++) {
        for (int j = 0; j < lie; j++) {
            printf("%d", t[i][j]);
            if (j + 1 < lie) {
                printf(" ");
            }
        }
        printf("\n");
    }
}

原文地址:https://www.cnblogs.com/tanghm/p/12661689.html

时间: 2024-10-10 12:48:39

1050 螺旋矩阵 (25分)的相关文章

PTA乙级(*1050 螺旋矩阵 (25分))

1050 螺旋矩阵 (25分) https://pintia.cn/problem-sets/994805260223102976/problems/994805275146436608 https://paste.ubuntu.com/p/Dn7fQ9Gf73/ #include <cstdio> #include <iostream> #include <cstring> #include <string> #include <cmath>

PAT Basic 1050 螺旋矩阵 (25 分)

本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”.所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为 m 行 n 列,满足条件:m×n 等于 N:m≥n:且 m−n 取所有可能值中的最小值. 输入格式: 输入在第 1 行中给出一个正整数 N,第 2 行给出 N 个待填充的正整数.所有数字不超过 1,相邻数字以空格分隔. 输出格式: 输出螺旋矩阵.每行 n 个数字,共 m 行.相邻数字以 1 个空格分隔,行末不得有多余空格. 输入样例: 12 3

1050. 螺旋矩阵(25)

本题要求将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”.所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为m行n列,满足条件:m*n等于N:m>=n:且m-n取所有可能值中的最小值. 输入格式: 输入在第1行中给出一个正整数N,第2行给出N个待填充的正整数.所有数字不超过104,相邻数字以空格分隔. 输出格式: 输出螺旋矩阵.每行n个数字,共m行.相邻数字以1个空格分隔,行末不得有多余空格. 输入样例: 12 37 76 20 98 76 42 53 95

1050. 螺旋矩阵(25) pat乙级题

本题要求将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”.所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为m行n列,满足条件:m*n等于N:m>=n:且m-n取所有可能值中的最小值. 输入格式: 输入在第1行中给出一个正整数N,第2行给出N个待填充的正整数.所有数字不超过104,相邻数字以空格分隔. 输出格式: 输出螺旋矩阵.每行n个数字,共m行.相邻数字以1个空格分隔,行末不得有多余空格. 输入样例: 12 37 76 20 98 76 42 53 95

PAT 1050. 螺旋矩阵

PAT 1050. 螺旋矩阵 本题要求将给定的N个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第1个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为m行n列,满足条件:m*n等于N:m>=n:且m-n取所有可能值中的最小值. 输入格式: 输入在第1行中给出一个正整数N,第2行给出N个待填充的正整数.所有数字不超过104,相邻数字以空格分隔. 输出格式: 输出螺旋矩阵.每行n个数字,共m行.相邻数字以1个空格分隔,行末不得有多余空格.

PAT-乙级-1050 螺旋矩阵

本题要求将给定的 N 个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第 1 个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为 m 行 n列,满足条件:m×n 等于 N:m≥n:且 m?n 取所有可能值中的最小值. 输入格式: 输入在第 1 行中给出一个正整数 N,第 2 行给出 N 个待填充的正整数.所有数字不超过 104,相邻数字以空格分隔. 输出格式: 输出螺旋矩阵.每行 n 个数字,共 m 行.相邻数字以 1 个空格分隔,行末不得有

1050 螺旋矩阵

题意: 结果: 分析: 要仔细读题,题目中已经暗示了做题的方法,那么这就是一类简单模拟题. 这个方法就是: 步骤一,把元素向右一直填入矩阵,直到碰到矩阵边界,或者将要填入的位置已存在元素,就停止填入,转步骤二: 步骤二,把元素向下一直填入矩阵,直到碰到矩阵边界,或者将要填入的位置已存在元素,就停止填入,转步骤三: 步骤三,把元素向左一直填入矩阵,直到碰到矩阵边界,或者将要填入的位置已存在元素,就停止填入,转步骤四: 步骤四,把元素向上一直填入矩阵,直到碰到矩阵边界,或者将要填入的位置已存在元素,

pat乙级1050螺旋矩阵

1.用vector建立二维数组: 1 vector<vector<int>> arr(rows); 2 for (int i = 0; i < rows; i++) 3 arr[i].resize(cols); 或: 1 vector<vector<int>> v(m, vector<int>(n)); 2.当数组已初始化但某些下标还未赋值时,此下标对应的变量为NULL(见34行) 代码: 1 #include <iostream&g

PAT 甲级 1105 Spiral Matrix (25分)(螺旋矩阵,简单模拟)

1105 Spiral Matrix (25分) This time your job is to fill a sequence of N positive integers into a spiral matrix in non-increasing order. A spiral matrix is filled in from the first element at the upper-left corner, then move in a clockwise spiral. The