王道論壇計算機考研機試指南 四 排版題

例2.7 輸出梯形 (九度教程第14題)
時間限制:1秒 **內(nèi)存限制:32兆 ** 特殊判題:否

題目描述:
輸入一個高度h溯乒,輸出一個高為h宫屠,上底邊為h的梯形。

輸入:
一個整數(shù)h(1<=h<=1000)稽揭。

輸出:
h所對應(yīng)的梯形俺附。

樣例輸入:
4

樣例輸出:

      **** 
    ****** 
  ********
**********

提示:
梯形每行都是右對齊的,sample中是界面顯示問題

來源:
2001年清華大學(xué)計算機研究生機試真題(第II套)

#include <stdio.h>
int main () {
int h;
while (scanf ("%d",&h) != EOF) {
    int maxLine = h + (h - 1) * 2; //計算最后一行包含的星號個數(shù)
    for (int i = 1;i <= h;i ++) { //依次輸出每行信息
        for (int j = 1;j <= maxLine;j ++) { //依次輸出每行當中的空格或星號         
            if (j < maxLine - h - (i - 1) * 2 + 1)
            printf(" ");
            //輸出空格           
            else
            //輸出星號           
            printf("*");
        }
    printf("\n"); //輸出換行
    }    
    }
    return 0;
}
例2.8 疊筐 (九度教程第15題)
時間限制:1秒 **內(nèi)存限制:32兆 ** 特殊判題:否

題目描述:
把一個個大小差一圈的筐疊上去溪掀,使得從上往下看時事镣,邊筐花色交錯。這個工作現(xiàn)在要讓計算機來完成揪胃,得看你的了璃哟。

輸入:
輸入是一個個的三元組,分別是喊递,外筐尺寸n(n為滿足0<n<80的奇整數(shù))随闪,中心花色字符,外筐花色字符骚勘,后二者都為ASCII可見字符铐伴;

輸出:
輸出疊在一起的筐圖案,中心花色與外筐花色字符從內(nèi)層起交錯相疊调鲸,多筐相疊時盛杰,最外筐的角總是被打磨掉挽荡。疊筐與疊筐之間應(yīng)有一行間隔藐石。

樣例輸入:
11 B A
5 @ W

樣例輸出:

 AAAAAAAAA
ABBBBBBBBBA
ABAAAAAAABA
ABABBBBBABA
ABABAAABABA
ABABABABABA
ABABAAABABA
ABABBBBBABA
ABAAAAAAABA
ABBBBBBBBBA 
 AAAAAAAAA 

 @@@
@WWW@
@W@W@
@WWW@ 
 @@@
#include <stdio.h>
int main () {
    int outPutBuf[82][82]; //用于預(yù)排版的輸出緩存
    char a , b; //輸入的兩個字符
    int n; //疊框大小
    bool firstCase = true; //是否為第一組數(shù)據(jù)標志,初始值為true
        while (scanf ("%d %c %c",&n,&a,&b) == 3) {
        if (firstCase == true) { //若是第一組數(shù)據(jù)
            firstCase = false; //將第一組數(shù)據(jù)標志標記成false
            }
        else printf("\n"); //否則輸出換行
        for (int i = 1,j = 1;i <= n;i += 2,j ++) { //從里至外輸出每個圈
            int x = n / 2 + 1 , y = x;
            x -= j - 1;y -= j - 1; //計算每個圈右上角點的坐標
            char c = j % 2 == 1 ? a : b; //計算當前圈需要使用哪個字符
            for (int k = 1;k <= i;k ++) { //對當前圈進行賦值
                outPutBuf[x + k - 1][y] = c; //左邊賦值
                outPutBuf[x][y + k - 1] = c; //上邊賦值
                outPutBuf[x + i - 1][y + k - 1] = c; //右邊賦值
                outPutBuf[x + k - 1][y + i - 1] = c; //下邊賦值
            }
        }
        if (n != 1) { //注意當n為1時不需此步驟
            outPutBuf[1][1] = ' ';
            outPutBuf[n][1] = ' ';
            outPutBuf[1][n] = ' ';
            outPutBuf[n][n] = ' '; //將四角置為空格
        }
        for (int i = 1;i <= n;i ++) {
            for (int j = 1;j <= n;j ++) {
                printf("%c",outPutBuf[i][j]);
            }
            printf("\n");
        } //輸出已經(jīng)經(jīng)過排版的在輸出緩存中的數(shù)據(jù)
    }
    return 0;
}
如該代碼所示定拟,我們不再在輸出時使用我們得到的規(guī)律于微,而是用另一種更容
易的方法完成排版逗嫡。我們利用一個緩存數(shù)組來表示將要輸出的字符陣列,我們對
該字符陣列的坐標作如下規(guī)定株依,規(guī)定陣列左上角字符坐標為(1驱证,1),陣列右下
角字符坐標為(n恋腕,n)抹锄,其它坐標可由此推得。程序按照由最內(nèi)圈至最外圈的的
順序來完成圖形的排列荠藤。在完成每圈排列時伙单,我們都需要注意兩個要點:首先需
要確定該圈左上角的坐標。我們將以這個坐標為參照點來完成該圈的其它字符位
置的確定(當然也可以選用其它點)哈肖。觀察圖形得知吻育,最中間圈的左上角字符坐
標為(n / 2 + 1,n / 2 + 1),次中間圈的左上角字符坐標為(n / 2 + 1- 1,n / 2 + 1 - 1),淤井,
依次類推即可得到圖形中每一個圈的參照點布疼。其次,我們需要計算該圈每邊邊長
長度币狠。這也較容易得出游两,中心圈長度為 1,次中心圈長度為 3总寻,依次類推器罐,外圈
總比內(nèi)圈長度增加 2。注意了這兩點以后渐行,我們按照以下順序完成每圈的排版轰坊,
首先明確該圈使用哪一個字符來填充,我們使用判斷循環(huán)次數(shù)指示變量 j 的奇偶
性來判斷當前需要使用的字符祟印,即奇數(shù)次循環(huán)時(j 為奇數(shù))時使用第一個字符肴沫,
偶數(shù)次循環(huán)時使用第二個字符。然后蕴忆,我們確定該圈左上角字符的坐標颤芬,我們使
用中心坐標(n / 2 + 1,n / 2 + 1)減去當前循環(huán)次數(shù)指示變量 j 來確定該圈左上
角坐標套鹅,即(n / 2 + 1- j,n / 2 + 1 - j)站蝠。接著,我們計算該圈邊長長度卓鹿,我們利用
初始值為 1 的循環(huán)指示變量 i 來表示邊長長度菱魔,并在每次循環(huán)結(jié)束后加 2,代表邊長由 
1 開始吟孙,每外移一個圈邊長長度即加上 2澜倦。利用變量 i 所存的值我們即可
對當前圈的四條邊進行賦值聚蝶,對應(yīng)的坐標已在代碼中給出,這里不再列舉藻治。在完
成所有圈的編排后碘勉,我們只需按照題目的需要去除四個角的字符,最后將整個輸
出緩存中的字符陣列輸出即可桩卵。
另外验靡,此代碼還有兩個注意點值得我們指出。
1.輸出格式雏节。題面要求我們在輸出的每個疊筐間輸出一個空行晴叨,即除了最后
一個疊筐后沒有多余的空行,其它疊筐輸出完成后都需要額外的輸出一個空行矾屯。
為了完成這個要求兼蕊,我們將要求形式改變?yōu)槌嗽诘谝粋€輸出的疊筐前不輸出一
個空行外,在其它每一個輸出的疊筐前都需要輸出一個額外的空行件蚕。為完成這一
目的孙技,我們在程序開頭設(shè)立了 firstCase 變量來表示正在處理數(shù)據(jù)的是否為第一組
數(shù)據(jù),毫無疑問它的初始值為 true排作。在程序讀取每組數(shù)據(jù)后牵啦,我們都測試 firstCase
的值,若其為 true 則表示當前處理的數(shù)據(jù)為第一組數(shù)據(jù)妄痪,我們不輸出空行哈雏,并在
此時將 firstCase 變量改變?yōu)?false。以后衫生,每當程序讀入數(shù)據(jù)裳瘪,測試 firstCase 變
量時,該變量均為 false罪针,于是我們完成題目的要求彭羹,在輸出的疊筐前額外的輸
出一個空行,來達到題面對于輸出格式的要求泪酱。
2.邊界數(shù)據(jù)處理派殷。按上文所說,我們在輸出緩存中完成字符陣列排版后墓阀,需
要將該陣列四個角的字符修改為空格毡惜,但是這一修改不是一定需要的。當輸入的
n 為 1 時斯撮,該修改會變得多余经伙,它會使輸出僅變?yōu)橐粋€空格,這與題面要求不符吮成。
因此橱乱,在進行該修改之前,我們需要對 n 的數(shù)值作出判斷粱甫,若其不為 1 則進行修
改泳叠,否則跳過修改部分。由此不難看出茶宵,機試考題要求我們在作答時危纫,不僅能夠
大致的把握算法,同時還要細致的考慮邊界數(shù)據(jù)會給我們的程序造成什么樣的影
響乌庶。只有充分考慮了所有情況种蝶,并保證在所有題面明確將會出現(xiàn)的條件下,程序
依舊能夠正常工作瞒大,這樣我們才能使自己的程序真正的萬無一失螃征、滴水不漏。
本例介紹了另一種解決排版題的思路透敌,當輸出圖形所具有的規(guī)律不能或者很難直
接應(yīng)用到輸出上時盯滚,我們就要考慮采用該例所采用的方法,先用一個二維數(shù)組來
保存將要輸出的字符陣列酗电,并在該數(shù)組上首先完成排版魄藕。因為沒有了輸出時從上
至下、從左至右的順序限制撵术,我們能更加隨意的按照自己的需要或者圖形的規(guī)律
來依次輸出圖形背率,從而完成題目要求。
題目1161 Repeater (九度教程第16題)
時間限制:1秒 **內(nèi)存限制:32兆 ** 特殊判題:否

來源:
2011年北京大學(xué)計算機研究生機試真題

#include<stdio.h>  
#include<stdlib.h>  
#include<math.h>  
int n,q;  
char a[10][10],s[3005][3005];  
void input()  
{  
    int i,j;  
    getchar();  
    for(i=0;i<n;i++)  
    {  
        for(j=0;j<n;j++)  
            scanf("%c",&a[i][j]);  
        getchar();  
    }  
    scanf("%d",&q);  
}  
void print(int x,int y,int p)  
{  
    int i,j;  
    int h,k;  
    if(p==1)  
    {  
        for(i=0;i<n;i++)  
            for(j=0;j<n;j++)  
                s[x+i][y+j]=a[i][j];  
    }  
    else  
    {  
        for(i=0;i<n;i++)  
        {  
            for(j=0;j<n;j++)  
            {  
                if(a[i][j]!=' ')  
                {  
                    print(x+i*pow(n*1.0,(p-1)*1.0),y+j*pow(n*1.0,(p-1)*1.0),p-1);  
                }  
                else  
                {  
                    for(h=x+i*pow(n*1.0,(p-1)*1.0);h<x+(i+1)*pow(n*1.0,(p-1)*1.0);h++)  
                        for(k=y+j*pow(n*1.0,(p-1)*1.0);k<y+(j+1)*pow(n*1.0,(p-1)*1.0);k++)  
                            s[h][k]=' ';  
                }  
            }  
        }  
    }  
}  
int main()  
{  
    int i,j;  
    while(scanf("%d",&n)!=EOF&&n)  
    {  
        input();  
        print(0,0,q);  
        for(i=0;i<pow(n*1.0,q*1.0);i++)  
        {  
            for(j=0;j<pow(n*1.0,q*1.0);j++)  
                printf("%c",s[i][j]);  
            printf("\n");  
        }  
    }  
    return 0;  
}  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嫩与,一起剝皮案震驚了整個濱河市寝姿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌划滋,老刑警劉巖会油,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異古毛,居然都是意外死亡翻翩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進店門稻薇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嫂冻,“玉大人,你說我怎么就攤上這事塞椎〗胺拢” “怎么了?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵案狠,是天一觀的道長服傍。 經(jīng)常有香客問我钱雷,道長,這世上最難降的妖魔是什么吹零? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任罩抗,我火速辦了婚禮,結(jié)果婚禮上灿椅,老公的妹妹穿的比我還像新娘套蒂。我一直安慰自己,他們只是感情好茫蛹,可當我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布操刀。 她就那樣靜靜地躺著,像睡著了一般婴洼。 火紅的嫁衣襯著肌膚如雪骨坑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天柬采,我揣著相機與錄音卡啰,去河邊找鬼。 笑死警没,一個胖子當著我的面吹牛匈辱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播杀迹,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼亡脸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了树酪?” 一聲冷哼從身側(cè)響起浅碾,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎续语,沒想到半個月后垂谢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡疮茄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年滥朱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片力试。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡徙邻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出畸裳,到底是詐尸還是另有隱情缰犁,我是刑警寧澤,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站帅容,受9級特大地震影響颇象,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜并徘,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一遣钳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧饮亏,春花似錦、人聲如沸阅爽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽付翁。三九已至简肴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間百侧,已是汗流浹背砰识。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留佣渴,地道東北人辫狼。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像辛润,于是被迫代替她去往敵國和親膨处。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,666評論 2 350

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