题目描述:
坑:
- 题意太不明确了!!前景色都没有用到。。。
- mn的含义,和常规不同,这里的mn分别表示列和行!
- 数组太大的问题
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