借鉴于一位博主,最后是其文章链接
//首先是要明白这道题的题干,我们写的代码只需写关于输出结果怎么来的
//2 2
//1 13
//0 9985
//样例解读:第一行是染色做多次数为两次,有2个,下一个为染色次数为1次,有13个,
//然后是零次的,既没被染色的,有9985个,一共是10000个方块
//思路:
//第一步:所有方块起初都为 0,然后给方块染色,染一次变为 1,再染一次,再原来的基础上+1,
//第二步:选出染色次数最多的有几个,
//最后一步:放入要输出的数组中
//需要提交的函数代码
void paint(int n, int l[][4], int * result)
{
int coords[100][100] = {0}; //要染色的10000个方块,初值为 0
for (int i = 0; i < n; i++)
{ //遍历每个矩形并染色
for (int x = l[i][0]; x < l[i][2]; x++)
{
for (int y = l[i][1]; y < l[i][3]; y++)
{
coords[x][y]+=1; //染一次变为 1,再染一次,再原来的基础上+1,
}
}
}
int cishu[101] = {0}; //最大染色次数为100次
for (int x = 0; x < 100; x++)
{ //计数,以cishu数组下标记为染色次数,其对应的值记为被染色方格数
for (int y = 0; y < 100; y++)
{
cishu[coords[x][y]] +=1; //如cishu[5] = 3表示为被染色5次的方格数量有3个
}
}
int max = 0;
for (int x = 0; x < 100; x++)
{
for (int y = 0; y < 100; y++)
{
if(coords[x][y] > max)
{
max = coords[x][y]; //选出染色次数最多的
}
}
}
int k = 0;
for (int i = max; i >= 0; i--)
{ //为result数组赋值
result[k++] = i; //从最大的染色次数依次递减至 0 ,比如 2 1 0;
result[k++] = cishu[i]; //比如i=2, cishu[2]=2,i=1,cishu[1]=13,i=0,cishu[0]=9985
}
}
//主函数,不用提交
#include
void paint(int n, int (*l)[4], int * result);//函数声明(可省略变量名称n, l, result)
int main()
{
int n, l[100][4];
int result[300];
int i;
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%d %d %d %d", &l[i][0], &l[i][1], &l[i][2] ,&l[i][3]);//要染色的坐标
paint(n, l, result);//调用函数
for (i = 0; i <= result[0]; i++)
printf("%d %d\n", result[i * 2], result[i * 2 + 1]);
return 0;
}
XDOJ_536_染色次数统计-CSDN博客