1 条题解

  • 0
    @ 2025-8-24 21:59:14

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Gu_Ren
    竞赛就是这样,任何一次失误都可能成为永远的遗憾。

    搬运于2025-08-24 21:59:14,当前版本为作者最后更新于2021-01-09 11:37:40,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    萌新刚从Pascal\mathit{Pascal}转到c++\mathit{c++}(码风不好勿喷),打算做道题试试自己的语法,于是随机跳到了这个黄题\color{yellow}\colorbox{Purple}{黄题},结果调了一上午。。。

    我发现这样一种简洁的思路,因为每个点都是"."\mathrm{"."}"x"\mathrm{"x"},所以可以把它们转化成二进制(可以把二维的矩阵转成一维的);

    然后把二进制再转回十进制,就可以得到0$\sim9每个数(还有“+”)的9**每个数(还有“+”)的\mathrm{"ASCII"}$矩阵独有的十进制数**;

    最后把读入的矩阵分别转成十进制,再去找提前准备好的十进制数,对应一下得到0$\sim$9这些数

    最后把这些数拼起来运算一下,把对应的"ASCII"\mathrm{"ASCII"}矩阵输出即可。

    小问题:一开始我以为会有多个“+”,于是计算总和的写法有点奇怪

    #include <bits/stdc++.h>
    using namespace std;
    string s[11];
    int a[30][1000],x,num,t,cnt;
    char m[30][1000];
    int b[30],ans[30],dt[30],d[30];
    int c[11]={
    	1363481695,272696336,1098712095,276628511,276632657,276566111,1367085151,272696351,1367151711,276632671,75251968
    };//提前准备0~9和“+”对应的矩阵转成二进制的值(也是通过这个程序算出的)
    string e[10]={
    	("xxxxxx...xx...xx...xx...xx...xxxxxx"),
    	("....x....x....x....x....x....x....x"),
    	("xxxxx....x....xxxxxxx....x....xxxxx"),
    	("xxxxx....x....xxxxxx....x....xxxxxx"),
    	("x...xx...xx...xxxxxx....x....x....x"),
    	("xxxxxx....x....xxxxx....x....xxxxxx"),
    	("xxxxxx....x....xxxxxx...xx...xxxxxx"),
    	("xxxxx....x....x....x....x....x....x"),
    	("xxxxxx...xx...xxxxxxx...xx...xxxxxx"),
    	("xxxxxx...xx...xxxxxx....x....xxxxxx"),
    };//提前准备0~9对应的ASCII矩阵(长5 宽7)
    
    int main(){
    	for (int i=1;i<=7;i++){
    		cin>>s[i];
    		s[i]=s[i]+'.';
    	}//为了确保最后一个数的二进制位数与前面的一样,所以在每行末尾加个“.”
        int n=s[1].length();
        for (int i=1;i<=7;i++)
        for (int j=0;j<n;j++){
        	a[i][j]=(s[i][j]=='x');//转二进制,“x”为1,“.”为0
    	}
        t=1;
        for (int i=0;i+6<=n;i+=6){//把矩阵当做一维处理
        	x=1;
        	for (int j=1;j<=7;j++)
        	{//二进制转十进制
        	    for (int k=i;k<i+6;k++)
        	    {
        			b[num]+=x*a[j][k];
        			x=x*2;
        		}
        	}
            for (int j=0;j<10;j++)
            if (b[num]==c[j]){
                ans[t]=ans[t]*10+j;
                break;
            }
            if (b[num]==75251968) t++;//特判加号
            num++;
    	}
        for (int i=1;i<=t;i++) ans[t+1]+=ans[i];
        while(ans[t+1]!=0){//取出答案(十进制)的每一位数
            cnt++;
            dt[cnt]=ans[t+1]%10;
            ans[t+1]=ans[t+1]/10;
        }
        for (int i=1;i<=cnt;i++) d[i]=dt[cnt-i+1];
    	for (int i=0;i<35;i+=5){//输出参考了大佬的写法
    		for (int j=1;j<=cnt;j++)
    		{
    			for (int k=i;k<=i+4;k++)
    			printf("%c",e[d[j]][k]);
    			if (j!=cnt) printf(".");
    		}
    		printf("\n");
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    3310
    时间
    1000ms
    内存
    500MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者