自己测试都没问题,但提交后却是Wrong Answer,不知道问题出在哪儿。
C++源代码:
// Edge Detection
// 2017.03.19 by wyj
#include
#include
#include
#include
#include
using namespace std; int Inmap[1100][2], Outmap[10000][2]; int width; int total; int main() { int GetValue(int pos); int GetCode(int pos); int comp(const void*a, const void*b); int pixelout; int In[1100],Out[10000]; //输入变换点的下标和对应周围点的下标 while (scanf_s("%d", &width) && width) { int n = 0, i = 0, j = 0, k = 0, p = 0; while ((cin >> Inmap[i][0] >> Inmap[i][1]) && (Inmap[i][0] || Inmap[i][1])) { In[i] = n; //第i个输入变化点的下标 n = n + Inmap[i][1]; i++; } total = n; for (p = 0;p < i;p++) { int row = In[p] / width; int col = In[p] % width; for (int x = row - 1;x <= row + 1;x++) for (int y = col - 1;y <= col + 1;y++) { if (x < 0 || y < 0 || y >= width || x*width + y >=total ) continue; Out[k++] = x*width + y; } } qsort(Out, k, sizeof(int), comp); Outmap[0][0] = GetCode(0); Outmap[0][1] = 1; int t = 0; for (p = 1;p < k;p++) { if (Out[p] == Out[p - 1]) continue; pixelout = GetCode(Out[p]); if (pixelout != GetCode(Out[p] - 1)) { Outmap[++j][0] = pixelout; Outmap[j-1][1] = Out[p] - t; t += Outmap[j - 1][1]; } } Outmap[j][1] = total - t; cout << width << endl; for (k = 0;k <= j;k++) cout << Outmap[k][0] << ' ' << Outmap[k][1] << endl; cout <<"0 0"<< endl; } cout << 0<< endl; return 0; } /*快排比较规则*/ int comp(const void*a, const void*b) { return *(int*)a - *(int*)b; } /*返回第pos个像素点的像素值*/ int GetValue(int pos) { int i = 0, p = 0; while (p<=pos) p += Inmap[i++][1]; return Inmap[i - 1][0]; } /*返回第pos个像素点的编码*/ int GetCode(int pos) { int code = GetValue(pos); int max(int a, int b, int c, int d, int e); int max(int a, int b, int c, int d, int e, int f, int g, int h); int MaxAbs = 0; int a[8]; int k; a[0] = pos - width - 1; a[1] = pos - width; a[2] = pos - width + 1; a[3] = pos - 1; a[4] = pos + 1; a[5] = pos + width - 1; a[6] = pos + width; a[7] = pos + width + 1; for (k = 0;k < 8;k++) { if (a[k] < 0 || a[k] >= total) a[k] = pos; } if (pos%width == 0) MaxAbs = max(abs(GetValue(pos) - GetValue(a[1])), abs(GetValue(pos) - GetValue(a[2])), abs(GetValue(pos) - GetValue(a[4])), abs(GetValue(pos) - GetValue(a[6])), abs(GetValue(pos) - GetValue(a[7]))); else if (pos%width == width - 1) MaxAbs = max(abs(GetValue(pos) - GetValue(a[0])), abs(GetValue(pos) - GetValue(a[1])), abs(GetValue(pos) - GetValue(a[3])), abs(GetValue(pos) - GetValue(a[5])), abs(GetValue(pos) - GetValue(a[6]))); else MaxAbs = max(abs(GetValue(pos) - GetValue(a[0])), abs(GetValue(pos) - GetValue(a[1])), abs(GetValue(pos) - GetValue(a[2])), abs(GetValue(pos) - GetValue(a[3])), abs(GetValue(pos) - GetValue(a[4])), abs(GetValue(pos) - GetValue(a[5])), abs(GetValue(pos) - GetValue(a[6])), abs(GetValue(pos) - GetValue(a[7]))); return MaxAbs; } int max(int a, int b, int c, int d, int e) { if (b > a) a = b; if (c > a) a = c; if (d > a) a = d; if (e > a) a = e; return a; } int max(int a, int b, int c, int d, int e, int f, int g, int h) { if (b > a) a = b; if (c > a) a = c; if (d > a) a = d; if (e > a) a = e; if (f > a) a = f; if (g > a) a = g; if (h > a) a = h; return a; }