码迷,mamicode.com
首页 > 其他好文 > 详细

1105 Spiral Matrix

时间:2018-08-29 20:04:27      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:print   swa   alt   amp   algo   png   上下   pat   ons   

题意:给出含N个数的序列,要求把这N个数按从大到小的顺序顺时针填入m*n的矩阵中,m,n需满足m*n=N,同时m>=n且m-n尽量小。

思路:我是按如下的方式,先从左往右把第1层填满,然后从第2层到倒数第2层把最右侧填满。。。

技术分享图片

然后设置flag来标记当前是第几圈,因为每一圈上下左右边界是变化的,如第一圈从左到右的边界是[0,n-1],第二圈(如果有的话)则是[1,n-2],用这个flag方便控制边界的变化,具体的看看代码,手动模拟即可。

注意:在for循环内不要忘记加idx<cnt进行控制!如3*1这种只有一列矩阵,不需要走完4个for循环就已经填满了。

代码:

#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int N=10005;
int data[N];
int matrix[100][100];//这个大小是随便定的,然后就过了。。。说明PAT的样例不够多啊

bool cmp(int a,int b){
    return a>b;
}

int main()
{
    //freopen("pat.txt","r",stdin);
    int cnt,m,n;//m行n列
    scanf("%d",&cnt);
    m=sqrt(cnt);
    while(cnt%m!=0) m--;
    n=cnt/m;
    if(m<n) swap(m,n);

    for(int i=0;i<cnt;i++)
        scanf("%d",&data[i]);
    sort(data,data+cnt,cmp);
    int flag=0,idx=0;
    while(idx<cnt){
        for(int col=flag;col<n-flag && idx<cnt;col++)
            matrix[flag][col]=data[idx++];
        for(int row=flag+1;row<m-1-flag && idx<cnt;row++)
            matrix[row][n-1-flag]=data[idx++];
        for(int col=n-1-flag;col>=flag && idx<cnt;col--)
            matrix[m-1-flag][col]=data[idx++];
        for(int row=m-2-flag;row>=flag+1 && idx<cnt;row--)
            matrix[row][flag]=data[idx++];
        flag++;
    }
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            printf("%d",matrix[i][j]);
            if(j<n-1) printf(" ");
            else printf("\n");
        }
    }
    return 0;
}

 

1105 Spiral Matrix

标签:print   swa   alt   amp   algo   png   上下   pat   ons   

原文地址:https://www.cnblogs.com/kkmjy/p/9556350.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!