一看题目感觉就是模拟题,但是直接模拟肯定超时超内存。但是压缩,又想不明白。
看了很多人的想法,感觉这个不错。就是将变化的点当做一个3*3矩阵中的中间点来算。同时将周围的8个点的相关情况也计算出来。
这样就相当于记录了变化点的前一个点的值包括最大绝对值,以及后一个点的情况。
到最后,只需要比较相邻两个点之间的值是否一样,如果不一样就减一下位置,可得到有多少个这样的点。一样的话就继续找下一个。
好想法啊!为何自己想不到。还是多得练习啊。
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int width;// the width of the Map
int total = 0;//the total num of pixel
struct Map
{
int pos;//position of the pixel
int code;//the code of the pixel
}pixMap[9010];
int mMap[1010][2];
int cmp(const void *a, const void *b)
{
struct Map * x = (struct Map *)a;
struct Map * y = (struct Map *)b;
return x->pos - y->pos;
}
int GetValue(int pos)
{
int i = 0;
int p = 0;
while (p < pos)
{
p += mMap[i ++][1];
}
return mMap[i - 1][0];
}
int GetCode(int pos)
{
int code = GetValue(pos);
int Max = 0;
int row = (pos - 1) / width;//the
int col = (pos - 1) % width;
for (int i = row - 1; i <= row + 1; ++ i)
{
for (int j = col - 1; j <= col + 1; ++ j)
{
int tpos = i * width + j;
if (i < 0 || j < 0 || j >= width || tpos >= total || tpos == pos - 1)
{
continue;
}
int tcode = GetValue(tpos + 1);
if (Max < abs(tcode - code))
{
Max = abs(tcode - code);
}
//pixMap[k].pos = tpos + 1;
//pixMap[k ++].code = GetCode(tpos + 1);
}
}
return Max;
}
int main()
{
int k;
int pix, pixNum;
while (cin >> width && width)
{
k = 0;
total = 0;
while(cin >> pix >> pixNum && pixNum)
{
mMap[k][0] = pix;
mMap[k ++][1] = pixNum;
total += pixNum;
}
int pairNum = k;
cout << width << endl;
int pos = 1;
k = 0;
for (int p = 0; p <= pairNum; ++ p)
{
int row = (pos - 1) / width;//the
int col = (pos - 1) % width;
for (int i = row - 1; i <= row + 1; ++ i)
{
for (int j = col - 1; j <= col + 1; ++ j)
{
int tpos = i * width + j;
if (i < 0 || j < 0 || j >= width || tpos >= total)
{
continue;
}
pixMap[k].pos = tpos + 1;
pixMap[k ++].code = GetCode(tpos + 1);
}
}
pos += mMap[p][1];
}
qsort(pixMap, k, sizeof(pixMap[0]), cmp);
struct Map tmp = pixMap[0];
for (int i = 0; i < k; ++ i)
{
if (tmp.code == pixMap[i].code)
{
continue;
}
cout << tmp.code << ' ' << pixMap[i].pos - tmp.pos << endl;
tmp = pixMap[i];
}
cout << tmp.code << ' ' << total - tmp.pos + 1 << endl;
cout << "0 0" << endl;
}
cout << 0 << endl;
return 0;
}