题目如上(至于YOJ2.0,那是我学校的做题网站)
先说一下感受吧:真的是爽死了,不过因为有提前打草稿(电纸书神!),所以中间的思路完全没出错,有什么错的话,也只有在输入上有问题。写了一个小时多,真的爽,希望以后能秒了
因为我有写注释,就不写解题思路了,核心就是一开始设置的两个数组,一个记录各点的数据,另一个记录坏点坐标(实际上你看名称也可以看得懂)
代码如下:
#include
#include
int main(void)
{
int m, n;
scanf("%d%d", &n, &m);
int data[n][m][4];//三个记数据,一个是否
int dead_pixel[m * n][3];//两个记坐标,一个是否
int num_of_dead_pixel = 0;
//对数据预处理
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
//输入
getchar();
getchar();
scanf("%d", &data[i][j][0]);
getchar();
getchar();
getchar();
scanf("%d", &data[i][j][1]);
getchar();
getchar();
getchar();
scanf("%d", &data[i][j][2]);
getchar();
//处理
if(data[i][j][0] + data[i][j][1] + data[i][j][2] == 0)
{
data[i][j][3] = 1;
dead_pixel[num_of_dead_pixel][0] = i;
dead_pixel[num_of_dead_pixel][1] = j;
dead_pixel[num_of_dead_pixel][2] = 1;
num_of_dead_pixel++;
}
else
data[i][j][3] = 0;
}
}
//开始修复
int num = num_of_dead_pixel;
while(num)
{
for(int i = 0; i < num_of_dead_pixel; i++)
{
if(dead_pixel[i][2])
{
//相加
int all_R = 0, all_G = 0, all_B = 0;//计算上下左右的总和
double num_tmp = 0.0;//用来记录加了多少次
if(dead_pixel[i][0] != 0)//上
if(data[dead_pixel[i][0] - 1][dead_pixel[i][1]][3] != 1)
{
all_R += data[dead_pixel[i][0] - 1][dead_pixel[i][1]][0];
all_G += data[dead_pixel[i][0] - 1][dead_pixel[i][1]][1];
all_B += data[dead_pixel[i][0] - 1][dead_pixel[i][1]][2];
num_tmp += 1.0;
}
if(dead_pixel[i][0] != n - 1)//下
if(data[dead_pixel[i][0] + 1][dead_pixel[i][1]][3] != 1)
{
all_R += data[dead_pixel[i][0] + 1][dead_pixel[i][1]][0];
all_G += data[dead_pixel[i][0] + 1][dead_pixel[i][1]][1];
all_B += data[dead_pixel[i][0] + 1][dead_pixel[i][1]][2];
num_tmp += 1.0;
}
if(dead_pixel[i][1] != 0)//左
if(data[dead_pixel[i][0]][dead_pixel[i][1] - 1][3] != 1)
{
all_R += data[dead_pixel[i][0]][dead_pixel[i][1] - 1][0];
all_G += data[dead_pixel[i][0]][dead_pixel[i][1] - 1][1];
all_B += data[dead_pixel[i][0]][dead_pixel[i][1] - 1][2];
num_tmp += 1.0;
}
if(dead_pixel[i][1] != m - 1)//右
if(data[dead_pixel[i][0]][dead_pixel[i][1] + 1][3] != 1)
{
all_R += data[dead_pixel[i][0]][dead_pixel[i][1] + 1][0];
all_G += data[dead_pixel[i][0]][dead_pixel[i][1] + 1][1];
all_B += data[dead_pixel[i][0]][dead_pixel[i][1] + 1][2];
num_tmp += 1.0;
}
//赋值修复
if(num_tmp == 0.0)//代表上下左右为坏点,等于没修
continue;
else
{
data[dead_pixel[i][0]][dead_pixel[i][1]][0] = (int)(ceil((double)all_R / num_tmp));
data[dead_pixel[i][0]][dead_pixel[i][1]][1] = (int)(ceil((double)all_G / num_tmp));
data[dead_pixel[i][0]][dead_pixel[i][1]][2] = (int)(ceil((double)all_B / num_tmp));
}
dead_pixel[i][2] = 2;//2代表这轮是坏点
num--;
}
}
//使这轮修复的不再是坏点
for(int i = 0; i < num_of_dead_pixel; i++)
if(dead_pixel[i][2] == 2)
{
dead_pixel[i][2] = 0;
data[dead_pixel[i][0]][dead_pixel[i][1]][3] = 0;
}
}
//输出
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
printf("R %d G %d B %d", data[i][j][0], data[i][j][1], data[i][j][2]);
if(j < m - 1)
putchar(' ');
}
if(i < n - 1)
putchar('\n');
}
return 0;
}
虽然英文名称可以让我们一看就懂,但是太长了搞得我有点头晕,以后试试缩写吧
最后就得了90分,有一个数据超时了(爽死了)
明天要去调研(双学位的苦),找个时间给代码优化一下
补充:调研完回来看代码了,感觉已经是最简的版本了,所以根本想不出其他的办法,最后发现是可以看范例的输入和输出,然后发现:居然还有全都是坏点根本修不了的情况,最后简单改了一下代码(就加了个判断语句),得了个100
#include
#include
int main(void)
{
int m, n;
scanf("%d%d", &n, &m);
int data[n][m][4];//三个记数据,一个是否
int dead_pixel[m * n][3];//两个记坐标,一个是否
int num_of_dead_pixel = 0;
//对数据预处理
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
//输入
getchar();
getchar();
scanf("%d", &data[i][j][0]);
getchar();
getchar();
getchar();
scanf("%d", &data[i][j][1]);
getchar();
getchar();
getchar();
scanf("%d", &data[i][j][2]);
getchar();
//处理
if(data[i][j][0] + data[i][j][1] + data[i][j][2] == 0)
{
data[i][j][3] = 1;
dead_pixel[num_of_dead_pixel][0] = i;
dead_pixel[num_of_dead_pixel][1] = j;
dead_pixel[num_of_dead_pixel][2] = 1;
num_of_dead_pixel++;
}
else
data[i][j][3] = 0;
}
}
//开始修复
if(num_of_dead_pixel != m * n)
{
int num = num_of_dead_pixel;
while(num)
{
for(int i = 0; i < num_of_dead_pixel; i++)
{
if(dead_pixel[i][2])
{
//相加
int all_R = 0, all_G = 0, all_B = 0;//计算上下左右的总和
double num_tmp = 0.0;//用来记录加了多少次
if(dead_pixel[i][0] != 0)//上
if(data[dead_pixel[i][0] - 1][dead_pixel[i][1]][3] != 1)
{
all_R += data[dead_pixel[i][0] - 1][dead_pixel[i][1]][0];
all_G += data[dead_pixel[i][0] - 1][dead_pixel[i][1]][1];
all_B += data[dead_pixel[i][0] - 1][dead_pixel[i][1]][2];
num_tmp += 1.0;
}
if(dead_pixel[i][0] != n - 1)//下
if(data[dead_pixel[i][0] + 1][dead_pixel[i][1]][3] != 1)
{
all_R += data[dead_pixel[i][0] + 1][dead_pixel[i][1]][0];
all_G += data[dead_pixel[i][0] + 1][dead_pixel[i][1]][1];
all_B += data[dead_pixel[i][0] + 1][dead_pixel[i][1]][2];
num_tmp += 1.0;
}
if(dead_pixel[i][1] != 0)//左
if(data[dead_pixel[i][0]][dead_pixel[i][1] - 1][3] != 1)
{
all_R += data[dead_pixel[i][0]][dead_pixel[i][1] - 1][0];
all_G += data[dead_pixel[i][0]][dead_pixel[i][1] - 1][1];
all_B += data[dead_pixel[i][0]][dead_pixel[i][1] - 1][2];
num_tmp += 1.0;
}
if(dead_pixel[i][1] != m - 1)//右
if(data[dead_pixel[i][0]][dead_pixel[i][1] + 1][3] != 1)
{
all_R += data[dead_pixel[i][0]][dead_pixel[i][1] + 1][0];
all_G += data[dead_pixel[i][0]][dead_pixel[i][1] + 1][1];
all_B += data[dead_pixel[i][0]][dead_pixel[i][1] + 1][2];
num_tmp += 1.0;
}
//赋值修复
if(num_tmp == 0.0)//代表上下左右为坏点,等于没修
continue;
else
{
data[dead_pixel[i][0]][dead_pixel[i][1]][0] = (int)(ceil((double)all_R / num_tmp));
data[dead_pixel[i][0]][dead_pixel[i][1]][1] = (int)(ceil((double)all_G / num_tmp));
data[dead_pixel[i][0]][dead_pixel[i][1]][2] = (int)(ceil((double)all_B / num_tmp));
}
dead_pixel[i][2] = 2;//2代表这轮是坏点
num--;
}
}
//使这轮修复的不再是坏点
for(int i = 0; i < num_of_dead_pixel; i++)
if(dead_pixel[i][2] == 2)
{
dead_pixel[i][2] = 0;
data[dead_pixel[i][0]][dead_pixel[i][1]][3] = 0;
}
}
}
//输出
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
printf("R %d G %d B %d", data[i][j][0], data[i][j][1], data[i][j][2]);
if(j < m - 1)
putchar(' ');
}
if(i < n - 1)
putchar('\n');
}
return 0;
}
哭死