1050. 螺旋矩阵(25)
来源:互联网 发布:vscode mactype 贴吧 编辑:程序博客网 时间:2024/05/22 10:28
本题要求将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为m行n列,满足条件:m*n等于N;m>=n;且m-n取所有可能值中的最小值。
输入格式:
输入在第1行中给出一个正整数N,第2行给出N个待填充的正整数。所有数字不超过104,相邻数字以空格分隔。
输出格式:
输出螺旋矩阵。每行n个数字,共m行。相邻数字以1个空格分隔,行末不得有多余空格。
输入样例:1237 76 20 98 76 42 53 95 60 81 58 93输出样例:
98 95 9342 37 8153 20 7658 60 76
#include <iostream>#include <cmath>#include <vector>#include <algorithm>using namespace std;int m=0,n=0,p=10000;void mn(int N){ //计算m , n的值 for(int i=2; i<=sqrt(N) ;i++){ if(N % i == 0){ int j = N /i; int q = j -i; //m,n之间的差值 if(q<p){ m = j; n = i; p = q; } } }}void Show(int **p,int m, int n){ //显示结果 for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(j==0) cout<<p[i][j]; else{ cout<<" "<<p[i][j]; } } cout<<endl; }}void Rec(int **res,int m,int n, vector<int> V){//、构造螺旋矩阵 //int small = m >=n ? n :m; vector<int>::iterator it = V.begin(); int count = n / 2; for(int i=0;i<count;i++){ int R = m -1 - i; int C = n -1 - i; for(int j=i;j<C;j++){ res[i][j] = *it; it++; //cout<<"yes"<<endl; } for(int j=i;j<R;j++){ res[j][C] = *it; it++; //out<<"ok"<<endl; } for(int j=C;j>i;j--){ res[R][j] = *it; it++; //cout<<"good"<<endl; } for(int j=R;j>i;j--){ res[j][i] = *it; if(it != V.end()) it++; //cout<<"nice"<<endl; } } if(n & 1){ //说明最后又1*k或者k*1的矩阵 int i = count; for(int j= i;j<m-i;++j){ res[j][i] = *it; if(it != V.end()) it++; } }}bool isPrime(int N){ for(int i=2;i<=sqrt(N);i++){ if(N % i == 0) return false; } return true;}int main(){ int N; cin>>N; if(N == 1) { int tmp; cin>>tmp; cout<<tmp<<endl; return 0; } if(isPrime(N)){ //cout<<"N is primer number!"<<endl; vector<int> Vec; for(int i=0;i<N;i++){ int tmp ; cin>>tmp; Vec.push_back(tmp); } sort(Vec.begin(),Vec.end(),greater<int>()); vector<int>::iterator its = Vec.begin(); while(its != Vec.end()){ cout<<*its<<endl; its++; } return 0; } vector<int> V; for(int i=0 ;i<N; i++) { int tmp; cin>>tmp; V.push_back(tmp); } sort(V.begin(),V.end(),greater<int>()); mn(N);//找出最差值最小的m n的值 //cout<<"m ,n"<<m<<" "<<n<<endl;// vector<int>::iterator it = V.begin();// int count=0;// while(it != V.end()){// count++;// if(count % n ==0){// cout<<*it<<endl;// }else{// cout<<*it<<" ";// }// ++it;// }// cout<<endl; //定义一个二维数组 int **res = new int *[n+1]; //如果设定 int **res = new int*(n) 当N 为10 和14 会发生段错误 我也不知道为什么 for(int i=0;i<m;i++){ res[i] = new int[n+1]; }// for(int i=0;i<m;i++){// for(int j=0;j<n;j++){// res[i][j]=0;// cout<<res[i][j]<<" ";// }// cout<<endl;// } Rec(res, m, n,V); Show(res,m,n); return 0;}
Aden:首先对其给个个数N求出满足条件的m和n,这样就可以确定自己所需要的二维矩阵的规模了,然后再构造螺旋矩阵,注意一定要对最后可能留存的k*1或者1*k个元素专门处理。
0 0
- 1050. 螺旋矩阵(25)
- 1050. 螺旋矩阵(25)
- 1050. 螺旋矩阵(25)
- 1050. 螺旋矩阵(25)
- 1050. 螺旋矩阵(25)
- 1050. 螺旋矩阵(25)
- 1050. 螺旋矩阵(25)
- 1050. 螺旋矩阵(25)
- 1050. 螺旋矩阵(25)
- 1050. 螺旋矩阵(25)
- 1050. 螺旋矩阵(25)
- 1050. 螺旋矩阵(25)
- 1050. 螺旋矩阵(25)
- 1050. 螺旋矩阵(25)
- 1050. 螺旋矩阵(25)
- 1050. 螺旋矩阵(25)
- 1050. 螺旋矩阵(25)
- 1050. 螺旋矩阵(25)
- java泛型程序设计
- 四元数与欧拉角之间的转换
- Android
- 对面向对象的一点理解
- Java设计模式-创建型模式
- 1050. 螺旋矩阵(25)
- [深入浅出Cocoa]详解键值观察(KVO)及其实现机理
- Living without D3DX
- MyEclipse下创建的项目 导入eclipse
- eclipse中如何在当前工程中查找一个字符串
- 追求之门的开启,坚定有意义
- centos7安装mysql
- 关于用OC---购票系统的关键部分
- ITOO4.1之WCF学习(一)