題目鏈接在此。
將給定的字符串按照U形進行輸出。其中n1為左側豎線包含的字符數,n2位底部包含的字符數,n3位右側豎線包含的字符數,n1,n2,n3都包含拐角處的字符,于是有n1+n2+n3-2=N。此外,n1,n2,n3還需要滿足以下條件: 1. n1==n3 2. n2 >= n1 3. 在滿足以上條件的前提下,n1盡可能大
對于“圖形輸出”的題型,一般都是兩種方法: 1. 找到規(guī)律,直接輸出 2. 找到規(guī)律,填入數組,輸出數組
對于這個題,我第一次想到的是填數組的方法,詳細介紹一下這個方法,至于直接輸出的方法,只需要注意輸出字符和空格的時機即可。
通過“題意理解”,我們可以列出幾個式子: n1<=n2 n3<=n2 n1+n2+n3-2 = N 這樣一來,我們可以得到n2>=(N+3)/2,那么,當n1=n3=(N+3)/2 時是符合題意的,故n2=N-n1-n3+2。(具體過程讀者自行演算、理解)
接下來就是將U分成左-下-右三個部分,填入PRint數組,細節(jié)不表,看代碼即可。
這里需要注意:print數組需要初始化為全空格、print數組的大小如果是固定大小,至少需要[28][28](根據式子且N<80可推出)。
不詳細介紹,仍然需要通過上面的三個式子計算出n1,n2,n3的值,通過它們的值控制輸出的行和列,以及每行的輸出情況。
我的代碼是用了left和right兩個“指針”來控制輸入字符串str[]數組的元素獲取,也可以像《算法筆記》上通過N和循環(huán)變量的關系來得到需要輸出的元素,皆可。
#include<stdio.h>#include<string.h>int main(){ char str[81]; scanf("%s",str); int n1,n2,n3,n; n = strlen(str); n1 = n3 = (n+2)/3; n2 = n-n1-n3+2; int left = 0, right = n-1; for(int i = 0 ; i < n1; i++){ for(int j = 0; j < n2; j++){ if( i < n1-1 ){ //輸出n1和n3 if(j == 0){ printf("%c",str[left++]); } else if( j == n2-1){ printf("%c",str[right--]); }else{ printf(" "); } }else{ printf("%c",str[left++]); } } printf("/n"); } return 0;}我把輸出控制(是輸出符號還是輸出空格)放到了循環(huán)變量里,也可以在每一行中,直接先輸出左側,然后輸出中間,再輸出右邊,這樣就不需要兩個循環(huán)變量之間的關系了。(《算法筆記》是這種方式)
新聞熱點
疑難解答