zoukankan      html  css  js  c++  java
  • PAT 1050 螺旋矩阵(25)(代码)

    1050 螺旋矩阵(25)(25 分)

    本题要求将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为m行n列,满足条件:m*n等于N;m>=n;且m-n取所有可能值中的最小值。

    输入格式:

    输入在第1行中给出一个正整数N,第2行给出N个待填充的正整数。所有数字不超过10^4^,相邻数字以空格分隔。

    输出格式:

    输出螺旋矩阵。每行n个数字,共m行。相邻数字以1个空格分隔,行末不得有多余空格。

    输入样例:

    12
    37 76 20 98 76 42 53 95 60 81 58 93
    

    输出样例:

    98 95 93
    42 37 81
    53 20 76
    58 60 76

    PS:

        这道题在《信息学奥赛》上有(我没有抄!那几个while的部分是在监视窗口一步步调试修正),这里用vector创建动态数组 ,跟其他人的代码没多大区别,所以这道题就不细说思路了,不懂的话可以直接找我0.0,另外还做了一些简化。

      注意:需要使用动态数组(测试点7)

    #include<iostream>
    #include<algorithm>
    #include<cmath>
    #include<vector>
    using namespace std;
    int main() {
    	int a[10000];
    	int N, m, n;
    	cin >> N;
    	for (int i = sqrt(N) + 1; i > 0; i--)
    		if (N%i == 0) {
    			m = i; n = N / i; break;
    		}
    	if (m < n)  swap(m, n);    //保证m>n;
    	vector<vector<int>>b(m + 1);   //使用vector创建二维动态数组(第1行第1列为了方便理解不使用)
    	for (int i = 0; i <= m; i++)
    		b[i].resize(n + 1);
    	for (int i = 0; i < N; i++)
    		cin >> a[i];
    	sort(a, a + N, greater<int>());    //降序排序
    	int i = 1, j = 0, count = 0;
    	while (N!=count) {
    		while (j < n&&b[i][j + 1] == 0) b[i][++j] = a[count++];
    		while (i < m&&b[i + 1][j] == 0)b[++i][j] = a[count++];
    		while (j > 1 && b[i][j - 1] == 0)b[i][--j] = a[count++];
    		while (i > 1 && b[i - 1][j] == 0)b[--i][j] = a[count++];
    	}
    	for (int i = 1; i <= m; i++) {
    		cout << b[i][1];
    		for (int j = 2; j <= n; j++)
    			cout << " " << b[i][j];
    		cout << endl;
    	}
    	return 0;
    }
    
  • 相关阅读:
    查找(二)简单清晰的B树、Trie树具体解释
    Java模式(适配器模式)
    程序猿生存定律--交换是职场里一切的根本
    list C++实现
    腾讯面试
    Android4.2.2启动动画前播放视频
    cocos2d0基础篇笔记一
    String.Split()函数
    oracle之表空间(tablespace)、方案(schema)、段(segment)、区(extent)、块(block)
    [一个互联网思想信徒]:今天突破69个听众
  • 原文地址:https://www.cnblogs.com/F-itachi/p/9974407.html
Copyright © 2011-2022 走看看