PAT-B 1050. 螺旋矩陣(25)

傳送門

https://pintia.cn/problem-sets/994805260223102976/problems/994805275146436608

題目

本題要求將給定的N個(gè)正整數(shù)按非遞增的順序捆姜,填入“螺旋矩陣”汰瘫。所謂“螺旋矩陣”,是指從左上角第1個(gè)格子開始伴栓,按順時(shí)針螺旋方向填充。要求矩陣的規(guī)模為m行n列雨饺,滿足條件:m*n等于N钳垮;m>=n;且m-n取所有可能值中的最小值额港。
輸入格式:
輸入在第1行中給出一個(gè)正整數(shù)N饺窿,第2行給出N個(gè)待填充的正整數(shù)。所有數(shù)字不超過10^4移斩,相鄰數(shù)字以空格分隔肚医。
輸出格式:
輸出螺旋矩陣绢馍。每行n個(gè)數(shù)字,共m行肠套。相鄰數(shù)字以1個(gè)空格分隔舰涌,行末不得有多余空格。
輸入樣例:
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

分析

我們先進(jìn)行題目分析你稚,先分解成一個(gè)個(gè)小問題瓷耙,然后逐個(gè)擊破:
1.先按倒序排列數(shù)組:
用algorithm里面的sort或者stdlib.h中的qsort都可以,但是qsort不能排vector刁赖,因?yàn)榈刂凡贿B續(xù)哺徊,這個(gè)要注意一下。要自己寫campare方法就行乾闰,默認(rèn)是升序的落追。
2.根據(jù)輸入的數(shù)組個(gè)數(shù),求出矩陣的行數(shù)和列數(shù):
這個(gè)方法有很多了涯肩,我用的就是對(duì)N開根的值開始轿钠,逐漸減到1,求m和n病苗,別的方法也行疗垛。
3.螺旋放置:
這個(gè)是難點(diǎn),我開始聲明了變量status來確定是怎樣放置的硫朦,一共有四種:左->右贷腕,上->下,右->左咬展,下->上泽裳,然后針對(duì)不同的status對(duì)坐標(biāo)有相應(yīng)的自增或自減方法,并且如果這一行如果被放置過了破婆,要給放置的次數(shù)做減1的操作涮总。

注意:我想到的螺旋放置方法不適用于只有一列的情況,要單獨(dú)判斷這種情況祷舀,單獨(dú)寫輸出方法瀑梗。

源代碼

//C/C++實(shí)現(xiàn)
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

bool compare(int a, int b){
    return a > b; //desc
}

int main(){
    int N;
    scanf("%d", &N);
    vector<int> v(N);
    for(int i = 0; i < N; ++i){
        scanf("%d", &v[i]);
    }
    //sort
    sort(v.begin(), v.end(), compare);
    //calculate m and n
    int i = sqrt((double)N);
    int m, n;
    for(; i >= 1; --i){
        if(N % i == 0){ //整除
            n = i;
            m = N / n;
            break;
        }
    }
    int a[m][n]; //一會(huì)改成a[m][n]
    int x = 0, y = -1;
    int status = 0; //從左向右是0,上向下是1裳扯,右向左是2抛丽,下向上是3
    int c0 = 0, c1 = 0, c2 = 0, c3 = 0; //走過該路徑就自增1
    if(n == 1){
        for(int i = 0; i < v.size(); ++i){
            printf("%d\n", v[i]);
        }
    }
    else{
        for(int i = 0; i < v.size(); ++i){
            if(status == 0){
                ++y;
                if(y == n - 1 - c1){
                    status = 1; //該從上往下填充了
                    ++c0;
                }
            }
            else if(status == 1){
                ++x;
                if(x == m - 1 - c2){
                    status = 2; //該從右往左填充了
                    ++c1;
                }
            }
            else if(status == 2){
                --y;
                if(y == 0 + c3){
                    status = 3; //該從下往上填充了
                    ++c2;
                }
            }
            else if(status == 3){
                --x;
                if(x == 0 + c0){ //該從左往右填充了
                    status = 0;
                    ++c3;
                }
            }
            a[x][y] = v[i];
        }
        for(int i = 0; i < m; ++i){
            for(int j = 0; j < n; ++j){
                if(j == 0){
                    printf("%d", a[i][j]);
                }
                else{
                    printf(" %d", a[i][j]);
                }
            }
            printf("\n");
        }
    }
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市饰豺,隨后出現(xiàn)的幾起案子亿鲜,更是在濱河造成了極大的恐慌,老刑警劉巖哟忍,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狡门,死亡現(xiàn)場(chǎng)離奇詭異陷寝,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)其馏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門凤跑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人叛复,你說我怎么就攤上這事仔引。” “怎么了褐奥?”我有些...
    開封第一講書人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵咖耘,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我撬码,道長(zhǎng)儿倒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任呜笑,我火速辦了婚禮夫否,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘叫胁。我一直安慰自己凰慈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開白布驼鹅。 她就那樣靜靜地躺著微谓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪输钩。 梳的紋絲不亂的頭發(fā)上豺型,一...
    開封第一講書人閱讀 51,245評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音张足,去河邊找鬼触创。 笑死坎藐,一個(gè)胖子當(dāng)著我的面吹牛为牍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播岩馍,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼碉咆,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了蛀恩?” 一聲冷哼從身側(cè)響起疫铜,我...
    開封第一講書人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎双谆,沒想到半個(gè)月后壳咕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體席揽,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年谓厘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了幌羞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡竟稳,死狀恐怖属桦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情他爸,我是刑警寧澤聂宾,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站诊笤,受9級(jí)特大地震影響系谐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜讨跟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一蔚鸥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧许赃,春花似錦止喷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至句喜,卻和暖如春预愤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背咳胃。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工植康, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人展懈。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓销睁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親存崖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冻记,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容