zoukankan      html  css  js  c++  java
  • A1105 Spiral Matrix (25分)

    一、技术总结

    1. 题意是,给定N个数字,然后要使得生成一个m x n的矩阵,同时m>=n;保证他们之间相差最小,数字要从大到小顺时针进行填充进入矩阵。
    2. 对于输入数字,使用cmp比较函数进行排序,同时使用vector进行存储。
    3. 具体形式如下图:
    4. 由上图知道,我们分析得出,m可以这样求出,用N开根号得到不超过这个数的最大整数a,然后再使用N去除以a,如果可以整除那么就得出了m,如果不能够,就让a一直减减,知道可以整除。
    5. 求出m后,我们看到上图,分析外层循环的层数,如果m是奇数level=m/2 + 1;如果m是偶数level=m/2,所以level = m / 2 + m % 2;
    6. t是用来保证,矩阵被填充完后就结束。
    7. 接下来就是分析内部的四层循环了,以第一层为例,首先是最上面一侧,可以发现是矩阵的n在变化,而m没有变化,所以j = i;j <= n - 1 - i && t < N - 1; j++ a[i][j],然后分析最右侧,发现矩阵数m在变化,n没有变,所以j = i + 1; j <= m - 2 - i && t < N - 1; j++ a[j][n - 1 - i],接下来分析最下侧,发现矩阵n在变化,而m没有发生变化,所以j = n - 1 - i; j >= i && t < N - 1; j-- a[m - 1 - i][j],最后分析最左侧, 发现是m在变化,n没有发生变化,所以j = m - 2 - i; j >= i && t < N - 1; j-- a[j][i]

    二、参考代码:

    #include<bits/stdc++.h>
    using namespace std;
    int cmp(int a, int b){
    	return a > b;
    }
    int main(){
    	int N, m, n, t = 0;
    	scanf("%d", &N);
    	for(n = sqrt((double)N); n >= 1; n--){
    		if(N % n == 0){
    			m = N / n;
    			break;
    		}
    	}
    	vector<int> a(N);
    	for(int i = 0; i < N; i++){
    		scanf("%d", &a[i]);
    	}
    	sort(a.begin(), a.end(), cmp);
    	vector<vector<int> > b(m, vector<int>(n));
    	int level = m / 2 + m % 2;
    	for(int i = 0; i < level; i++){
    		for(int j = i; j <= n - 1 - i && t <= N - 1; j++){
    			b[i][j] = a[t++];
    		}
    		for(int j = i + 1; j <= m - 2 - i && t <= N - 1; j++){
    			b[j][n - 1 - i] = a[t++];
    		}
    		for(int j = n - i - 1; j >= i && t <= N - 1; j--){
    			b[m - 1 - i][j] = a[t++];
    		}
    		for(int j = m - 2 - i; j >= i + 1 && t <= N - 1; j--){
    			b[j][i] = a[t++];
    		}
    	}
    	for(int i = 0; i < m; i++){
    		for(int j = 0; j < n; j++){
    			printf("%d", b[i][j]);
    			if(j != n - 1) printf(" ");
    		}
    		printf("
    ");
    	}
    	return 0;
    }
    
    作者:睿晞
    身处这个阶段的时候,一定要好好珍惜,这是我们唯一能做的,求学,钻研,为人,处事,交友……无一不是如此。
    劝君莫惜金缕衣,劝君惜取少年时。花开堪折直须折,莫待无花空折枝。
    曾有一个业界大牛说过这样一段话,送给大家:   “华人在计算机视觉领域的研究水平越来越高,这是非常振奋人心的事。我们中国错过了工业革命,错过了电气革命,信息革命也只是跟随状态。但人工智能的革命,我们跟世界上的领先国家是并肩往前跑的。能身处这个时代浪潮之中,做一番伟大的事业,经常激动的夜不能寐。”
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    centos7 下载并安装.netcore SKD,运行.netcore 应用程序
    小网站到大网站架构的演化之路 学习总结
    suppersocke,websocket 功能学习总结
    定时任务 quartZ
    RabbitMQ 安装和功能点
    rabbitmq 发送 消费消息
    富文本编辑器
    vue AES加密解密
    css动画库
    el-table合并表格
  • 原文地址:https://www.cnblogs.com/tsruixi/p/12927309.html
Copyright © 2011-2022 走看看