CCF CSP 201909-3 字符画

题目描述:
在这里插入图片描述坑:

  1. 题意太不明确了!!前景色都没有用到。。。
  2. mn的含义,和常规不同,这里的mn分别表示列和行!
  3. 数组太大的问题

AC代码:

#include<iostream>
using namespace std;
void transfer(int n)
{
    
    
	if(n<10) cout<<"\\x"<<30+n;
	else if(n<100) cout<<"\\x"<<n/10+30<<"\\x"<<n%10+30;
	else cout<<"\\x"<<n/100+30<<"\\x"<<(n/10)%10+30<<"\\x"<<n%10+30;
} 
int transferhex(char c)
{
    
    
	int t;
	if (c >= 'a')  t=c-'a'+10; 
	else if (c >= 'A')  t=c-'A'+10; 
	else t=c-'0';
	return t;
} 
static int R[1080][1920],G[1080][1920],B[1080][1920];
//static int R1[1080][1920],G1[1080][1920],B1[1080][1920];
int main()
{
    
    
	int m, n, p, q;
    scanf("%d %d %d %d", &m, &n, &p, &q);
    getchar();
    string a;
    int fn=n/q, fm=m/p,block=p*q;
    //static long R[n][m],G[n][m],B[n][m];
    int R1[fn][fm],G1[fn][fm],B1[fn][fm];
	for(int i=0;i<n;i++){
    
    
		for(int j=0;j<m;j++){
    
    
			getline(cin,a);
			if(a.length()==7) {
    
    
				R[i][j]=transferhex(a[1])*16+transferhex(a[2]);
				G[i][j]=transferhex(a[3])*16+transferhex(a[4]);
				B[i][j]=transferhex(a[5])*16+transferhex(a[6]);
			}
			else if(a.length()==4){
    
    
				R[i][j]=transferhex(a[1])*17;
				G[i][j]=transferhex(a[2])*17;
				B[i][j]=transferhex(a[3])*17;
			}
			else{
    
    
				R[i][j]=transferhex(a[1])*17;
				G[i][j]=R[i][j];
				B[i][j]=R[i][j];
			}
		}
	}
	long sumr=0,sumg=0,sumb=0;
	for(int i=0;i<fn;i++){
    
    
		for(int j=0;j<fm;j++){
    
    
			sumr=0;sumg=0;sumb=0;
			for(int i1=i*q;i1<(i+1)*q;i1++){
    
    
				for(int j1=j*p;j1<(j+1)*p;j1++){
    
    
					sumr+=R[i1][j1];sumg+=G[i1][j1];sumb+=B[i1][j1];
				}
			}
			R1[i][j]=sumr/block; G1[i][j]=sumg/block; B1[i][j]=sumb/block;
		}
	}
	for(int i=0;i<fn;i++){
    
    
		for(int j=0;j<fm;j++){
    
    
			if(j==0){
    
    
				if(R1[i][j]==0&&G1[i][j]==0&&B1[i][j]==0) cout<<"\\x20"; //与默认相同 输出空格
				else {
    
    
				cout<<"\\x1B\\x5B\\x34\\x38\\x3B\\x32\\x3B";
				transfer(R1[i][j]); cout<<"\\x3B";
				transfer(G1[i][j]); cout<<"\\x3B";
				transfer(B1[i][j]); cout<<"\\x6D\\x20";
				//cout<<"ESC[48;2;"<<R1[i][j]<<";"<<G1[i][j]<<";"<<B1[i][j]<<"m空格";
				} 
			}
			else{
    
    
				if(R1[i][j]==R1[i][j-1]&&G1[i][j]==G1[i][j-1]&&B1[i][j]==B1[i][j-1]) cout<<"\\x20"; //cout<<"空格"; 
				else if(R1[i][j]==0&&G1[i][j]==0&&B1[i][j]==0) cout<<"\\x1B\\x5B\\x30\\x6D\\x20"; //ESC[0m空格
				else{
    
    
				cout<<"\\x1B\\x5B\\x34\\x38\\x3B\\x32\\x3B";
				transfer(R1[i][j]); cout<<"\\x3B";
				transfer(G1[i][j]); cout<<"\\x3B";
				transfer(B1[i][j]); cout<<"\\x6D\\x20";				
				//cout<<"ESC[48;2;"<<R1[i][j]<<";"<<G1[i][j]<<";"<<B1[i][j]<<"m空格";
				}
			}
			if(j==(fm-1)&&(R1[i][j]!=0||G1[i][j]!=0||B1[i][j]!=0))	cout<<"\\x1B\\x5B\\x30\\x6D"; //cout<<"ESC[0m"  最后不为默认
		}
		//if(R1[i][fm-1]!=0||G1[i][fm-1]!=0||B1[i][fm-1]!=0)	cout<<"\\x1B\\x5B\\x30\\x6D"; //cout<<"ESC[0m"  最后不为默认 
		cout<<"\\x0A";
	}
	return 0;
}

在这里插入图片描述

感想:
其实这道题不算难!主要是题目读着太费劲啦!
A看题目看了好久!后来总算写出来了,中间经过了两次大bug:
一次不管怎么提交都是0分,后来才发现是输出的x0A的x被我弄成大写了。。。。。手动微笑。。。。
还有一个bug就是提交了之后是40分,不能满分,然后我看了要求之后发现后来的数据量增大,估计是数组内存的问题!!
后来结果看了一些博客的指引发现!!要用static全局静态变量去保存数组,因为如果直接就是局部变量的话数组是保存在栈中,很有可能会爆的!呜呜呜呜呜呜,但是stasic就不一样! 它是保存在.data节的数据区中!就够存,然后改了之后发现就100啦!

参考博客:
https://blog.csdn.net/best335/article/details/101296359

猜你喜欢

转载自blog.csdn.net/poppyty/article/details/103246125