1. 程式人生 > >UVA 706 LCD Display 液晶顯示屏 (字串模擬)

UVA 706 LCD Display 液晶顯示屏 (字串模擬)

題目大意

給定的數字序列,按照要求輸出對應液晶顯示屏上的數字

輸入:

2 12345
3 67890
0 0
輸出:
    --   --        -- 
   |    |    | |  | |   
   |    |    | |  | |   
      --   --   --   -- 
   | |       |    |    |
   | |       |    |    |
      --   --        -- 

 ---   ---   ---   ---   --- 
|         | |   | |   | |   |
|         | |   | |   | |   |
|         | |   | |   | |   |
 ---         ---   ---       
|   |     | |   |     | |   |
|   |     | |   |     | |   |
|   |     | |   |     | |   |
 ---         ---   ---   --- 
解題思路

模擬,考的就是細心了,先將n拆分為單個的數字,用一個數組存起來 ,定義每個數字的關鍵筆劃,可以知道之後的筆畫其實就是重複之前的筆畫!

程式碼:

/*
Author :HRW
UVA 706
字串模擬
思路:先將n拆分為單個的數字,用一個數組存起來 
       定義每個數字的關鍵筆劃,可以知道之後的筆畫其實就是重複之前的筆畫!
*/
#include <bits/stdc++.h>
using namespace std;
void AC(int s,int n)
{
    int a[8];
    memset(a,-1,sizeof(a)); // 將n拆分為單個的數字。  
    if(n==0) a[7]=0;
    else{
        for(int i=7;n>0; i--){
          a[i]=n%10;
          n/=10;
        }
    }                       // 定義每個數字的關鍵筆劃。  
    string  str[5][10]={
        " - ", "   ", " - ", " - ", "   ", " - ", " - ", " - ", " - ", " - ",
        "| |", "  |", "  |", "  |", "| |", "|  ", "|  ", "  |", "| |", "| |",
        "   ", "   ", " - ", " - ", " - ", " - ", " - ", "   ", " - ", " - ",
        "| |", "  |", "|  ", "  |", "  |", "  |", "| |", "  |", "| |", "  |",
        " - ", "   ", " - ", " - ", "   ", " - ", " - ", "   ", " - ", " - "
    };
                           // 將關鍵筆劃擴大顯示,從上到下分成5塊,依次判斷,實際上就是將關鍵筆劃重複。  
    for(int i=1;i<=(s*2+3);i++){
        for(int j=0;j<8;j++){
            if(a[j]!=-1){
            string ss;
            if(i==1) ss=str[0][a[j]];
            if(2<=i&&i<s+2)ss=str[1][a[j]];
            if(i==(s+2)) ss=str[2][a[j]];
            if(s+3<=i&&i<=(2*s+2)) ss=str[3][a[j]];
            if(i==(2*s+3)) ss=str[4][a[j]];
            cout<<ss[0];        // 輸出關鍵筆劃。  
            for(int k=0;k<s;k++)
            cout<<ss[1];
            cout<<ss[2];
            if(j<7) cout<<" "; // 在兩個數字間要有一列空行。  
            }
       }
          cout<<endl;
    }
}
int main()
{
   //freopen("1.txt","r",stdin);
   int s,n;
   while(cin>>s>>n)
   {
       if(s==0&&n==0) break;
       AC(s,n);
       cout<<endl;
   }
   return 0;
}