iT邦幫忙

2021 iThome 鐵人賽

DAY 10
0
自我挑戰組

用 C & C++ 帶你手把手解 UVa 一顆星選集系列 第 10

Day 0xA UVa490 Rotating Sentences

題意

  • 將輸入的多行字串改變順序後輸出
  • 需要注意的點有:
    1. 輸入最多 100 行
    2. 輸入的每行最多 100 個字元
    3. 合法字元
      • 換行、空白、標點符號、大小寫字母
      • Tabs
    4. 輸出順序
      • 順時鐘轉 90°
        abce #,\wa   21
             123 XWb YZQ
        qw-=       3Wx7U(
        
        q a
        w b
        - c
        = e
        
         1#
         2,
         3\
          w
         Xa
         W 
        3b 
        W  
        xY2
        7Z1
        UQ 
        (  
        
  • 隱藏要點:
    1. 字串長度不足要補空白

解法

  • while 迴圈重複輸入字串並存入字元陣列中直到 EOF;同時紀錄最長字串的長度
    char str[101][101] = {0};
    int row = 0;
    int max_length = 0;
    
    while(gets(str[row])){
        if(strlen(str[row]) > max_length){
            max_length = strlen(str[row]);
        }
        row++;
    }
    
  • 雙重 for 迴圈處理輸出順序;用 if 判斷是否長度不足
    • 外層代表輸入的字串左到右第幾個字元
    • 內層代表輸入的字串下到上第幾列
    for(i = 0; i < max_length; i++){
        for(j = row - 1; j >= 0; j--){
            if(i >= strlen(str[j])){
                printf(" ");
            }
            else{
                printf("%c", str[j][i]);
            }
        }
        printf("\n");
    }
    
  • C code
    #include<stdio.h>
    #include<string.h>
    
    int main(){
    
        char str[101][101] = {0};
        int row = 0;
        int i, j;
        int max_length = 0;
    
        while(gets(str[row])){
            if(strlen(str[row]) > max_length){
                max_length = strlen(str[row]);
            }
            row++;
        }
    
        for(i = 0; i < max_length; i++){
            for(j = row - 1; j >= 0; j--){
                if(i >= strlen(str[j])){
                    printf(" ");
                }
                else{
                    printf("%c", str[j][i]);
                }
            }
            printf("\n");
        }
    
        return 0;
    }
    

上一篇
Day 0x9 UVa272 TEX Quotes
下一篇
Day 0xB UVa948 Fibonaccimal Base
系列文
用 C & C++ 帶你手把手解 UVa 一顆星選集30

尚未有邦友留言

立即登入留言