我直接暴力模拟了,把每一个数字都转换成一行的字符串进行匹配,然后在输出的时候处理一下就好了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;

typedef long long ll;
const int N = 1e6+5;
const int mod = 1e6+3;
const int inf = 0x3f3f3f3f;

string s[11]={
"####.##.##.####",
"..#..#..#..#..#",
"###..#####..###",
"###..####..####",
"#.##.####..#..#",
"####..###..####",
"####..####.####",
"####.##.#..#..#",
"####.#####.####",
"####.####..####",
"....#.###.#....",
};

int main()
{
    int _;
    cin>>_;
    while(_--){
       string a[5];
       for(int i=0;i<5;i++) cin>>a[i];
       int len = a[0].size();
       int ans = 0,num = 0;
       for(int i=0;i<len;i+=4){
          string ss="";
          for(int j=0;j<5;j++){
             ss+=a[j][i];
             ss+=a[j][i+1];
             ss+=a[j][i+2];
          }
          int k;
          for(k=0;k<11;k++){
                if(ss == s[k]){
                    //cout<<s[k]<<endl;
                    break;
                }
          }
          if(k == 10)
            ans+=num,num = 0;
          else num = num*10+k;
          //cout<<num<<endl;
        }
        ans+=num;
        string ans1= "";
        //cout<<ans<<endl;
        while(ans){
            int t=ans%10;
            ans1+=(t+'0');
            ans/=10;
        }
        string r[5]={""};
        int cnt = 0;
        string m = ".";
        for(int i=ans1.size()-1;i>=0;i--){
            int t = ans1[i]-'0';
            cnt = 0;
            for(int ii=0;ii<15;ii+=3){//整行的数字转化为方块的数字,就是把数字的每一行添加到答案的每一行的后面,不同数字中间要有.隔开
                r[cnt]+= s[t][ii];
                r[cnt]+=s[t][ii+1];
                r[cnt]+=s[t][ii+2]+m;
                cnt++;
                //cout<<cnt<<endl;
            }
        }

        for(int i=0;i<5;i++){
            int t = r[i].size();
            for(int j=0;j<t-1;j++)//最后一个字符是.,不能输出
                cout<<r[i][j];
            if(i<5) cout<<endl;
        }
        if(_) cout<<endl;
    }
    return 0;
}