rt,问题出在extracted数组里,extract函数无法赋值,感觉流程对着呢
#include <bits/stdc++.h>
#define KevTheDev using
#define AK namespace
#define IOI std
KevTheDev AK IOI;
#define ull unsigned long long
#define rint register int
#define MAXW 9010
#define MAXH 66
#define INF 0x7fffffff
int t;
int w, h;
char b[MAXH][MAXW];
// 二值图
// 0 ~ 9
ull nums[10][58] = {
{ 0x7f8000, 0x1ffe000, 0x7fff800, 0xffffc00, 0x1ffffe00, 0x3fffff00, 0x7fffff80, 0x7fe1ff80, 0xff807fc0, 0xff003fc0, 0x1ff003fe0, 0x1fe001fe0, 0x1fe001fe0, 0x1fe001fe0, 0x3fc000ff0, 0x3fc000ff0, 0x3fc000ff0, 0x3fc000ff0, 0x3fc000ff0, 0x3fc000ff0, 0x3fc000ff0, 0x3fc000ff0, 0x3fc000ff0, 0x3fc000ff0, 0x3fc000ff0, 0x1fe001fe0, 0x1fe001fe0, 0x1fe001fe0, 0x1ff003fe0, 0xff003fc0, 0xff807fc0, 0x7fe1ff80, 0x7fffff80, 0x3fffff00, 0x1ffffe00, 0xffffc00, 0x7fff800, 0x1ffe000, 0x7f8000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, },
{ 0x78000, 0x1fc000, 0xffc000, 0x7ffc000, 0x3fffc000, 0x7fffc000, 0x7fffc000, 0x7fffc000, 0x7fffc000, 0x3f3fc000, 0x383fc000, 0x3fc000, 0x3fc000, 0x3fc000, 0x3fc000, 0x3fc000, 0x3fc000, 0x3fc000, 0x3fc000, 0x3fc000, 0x3fc000, 0x3fc000, 0x3fc000, 0x3fc000, 0x3fc000, 0x3fc000, 0x3fc000, 0x3fc000, 0x3fc000, 0x3fc000, 0x3fc000, 0x3fc000, 0x7fffffe0, 0xffffffe0, 0xffffffe0, 0xffffffe0, 0xffffffe0, 0x7fffffe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, },
{ 0xff8000, 0x7ffe000, 0x3ffff800, 0x7ffffc00, 0xfffffe00, 0xfffffe00, 0xffffff00, 0xff81ff00, 0xfe00ff80, 0xfe007f80, 0xfe007f80, 0xfe007f80, 0xfe007f80, 0x7e007f80, 0xff80, 0xff00, 0x1ff00, 0x3ff00, 0x7fe00, 0xffe00, 0x1ffc00, 0x3ff800, 0x7ff000, 0xffe000, 0x1ffc000, 0x3ff8000, 0x7ff07c0, 0xffe0fe0, 0x1ffc0fe0, 0x3ff80fe0, 0x7ff00fe0, 0xffe00fe0, 0x1ffffffe0, 0x1ffffffe0, 0x1ffffffe0, 0x1ffffffe0, 0x1ffffffe0, 0xffffffe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, },
{ 0xffc000, 0xffff000, 0x3ffffc00, 0x7ffffe00, 0x7fffff00, 0x7fffff80, 0x7fffff80, 0x7f80ffc0, 0x7f007fc0, 0x7f003fc0, 0x7f003fc0, 0x3f003fc0, 0x3fc0, 0x3fc0, 0x7f80, 0xff80, 0x7fff00, 0xfffe00, 0xfffc00, 0xfffe00, 0xffff00, 0x7fff80, 0xffc0, 0x3fc0, 0x3fe0, 0x1fe0, 0x1fe0, 0x1fe0, 0x1fe0, 0x3fe0, 0x70007fe0, 0xff00ffc0, 0xffffffc0, 0xffffff80, 0x1ffffff80, 0xffffff00, 0xfffffc00, 0x1ffff000, 0x3ff8000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, },
{ 0x1f000, 0x3f800, 0x7f800, 0xff800, 0x1ff800, 0x3ff800, 0x3ff800, 0x7ff800, 0xfff800, 0x1fff800, 0x3fff800, 0x7fff800, 0x7fbf800, 0xff3f800, 0x1fe3f800, 0x3fc3f800, 0x7fc3f800, 0x7f83f800, 0xff03f800, 0x1fe03f800, 0x3fffffff0, 0x3fffffff0, 0x3fffffff0, 0x3fffffff0, 0x3fffffff0, 0x3fffffff0, 0x7f800, 0x7f800, 0x7f800, 0x7f800, 0x7f800, 0x7f800, 0x1ffffe0, 0x3ffffe0, 0x3ffffe0, 0x3ffffe0, 0x3ffffe0, 0x1ffffe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, },
{ 0x0, 0x3fffff00, 0x3fffff80, 0x3fffff80, 0x3fffff80, 0x3fffff80, 0x3fffff00, 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000, 0x7f9fe000, 0x7ffff800, 0x7ffffe00, 0x7fffff00, 0x7fffff80, 0x7fffff80, 0x7fffffc0, 0x7f80ffc0, 0xc007fc0, 0x3fe0, 0x1fe0, 0x1fe0, 0x1fe0, 0x1fe0, 0x1fe0, 0x1fe0, 0x20003fe0, 0x78007fc0, 0xff01ffc0, 0xffffffc0, 0xffffff80, 0x1ffffff00, 0xfffffe00, 0x7ffffc00, 0x1ffff000, 0x1ff8000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, },
{ 0x1f80, 0x3ff80, 0x1fffc0, 0x7fffc0, 0x1ffffc0, 0x3ffffc0, 0x7ffff80, 0xffff000, 0x1ffe0000, 0x3ff80000, 0x3fe00000, 0x7fc00000, 0x7f800000, 0xff000000, 0xff000000, 0xfe1fe000, 0xfe7ffc00, 0x1ffffff00, 0x1ffffff80, 0x1ffffffc0, 0x1ffffffc0, 0x1ffe07fe0, 0x1ff803fe0, 0x1ff001ff0, 0x1fe000ff0, 0x1fe000ff0, 0x1fe000ff0, 0xfe000ff0, 0xfe000ff0, 0xff001ff0, 0xff803fe0, 0x7fe0ffe0, 0x3fffffe0, 0x3fffffc0, 0x1fffff80, 0xfffff00, 0x7fffe00, 0x1fff800, 0x3fc000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, },
{ 0x0, 0xffffffe0, 0xfffffff0, 0xfffffff0, 0xfffffff0, 0xfffffff0, 0xffffffe0, 0xfe003fe0, 0xfe003fe0, 0xfe007fc0, 0xfe007fc0, 0xfe007f80, 0xfe00ff80, 0xfe00ff00, 0xfe01ff00, 0x7c01ff00, 0x1fe00, 0x3fe00, 0x3fc00, 0x7fc00, 0x7f800, 0xff800, 0xff800, 0xff000, 0x1ff000, 0x1fe000, 0x3fe000, 0x3fc000, 0x3fc000, 0x7f8000, 0x7f8000, 0xff8000, 0xff0000, 0xff0000, 0x1fe0000, 0x1fe0000, 0x1fc0000, 0x1fc0000, 0x7c0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, },
{ 0x7fc000, 0x1fff000, 0x7fffc00, 0xffffe00, 0x1fffff00, 0x3fffff80, 0x3fffff80, 0x3fe0ff80, 0x7fc07fc0, 0x7f803fc0, 0x7f803fc0, 0x7f803fc0, 0x7f803fc0, 0x7f803fc0, 0x3fc07f80, 0x3fe0ff80, 0x1fffff00, 0xffffe00, 0x7fffc00, 0x7fffc00, 0x1fffff00, 0x3fffff80, 0x7fc0ffc0, 0xff003fc0, 0xff003fe0, 0x1fe001fe0, 0x1fe001fe0, 0x1fe001fe0, 0x1fe001fe0, 0x1ff003fe0, 0x1ff003fe0, 0xffc0ffc0, 0xffffffc0, 0x7fffff80, 0x7fffff80, 0x3fffff00, 0x1ffffe00, 0x7fff800, 0xffc000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, },
{ 0xff8000, 0x3ffe000, 0xffff800, 0x1ffffc00, 0x3ffffe00, 0x7fffff00, 0xffffff00, 0xffc0ff80, 0xff807fc0, 0x1ff003fc0, 0x1fe001fc0, 0x1fe001fc0, 0x1fe001fe0, 0x1fe001fe0, 0x1fe001fe0, 0x1ff003fe0, 0xff007fe0, 0xffc0ffe0, 0x7fffffe0, 0x7fffffe0, 0x3fffffe0, 0x1fffffe0, 0x7ff9fe0, 0x1fe1fc0, 0x1fc0, 0x3fc0, 0x3fc0, 0x7f80, 0xff80, 0x3ff00, 0xfff00, 0xfffe00, 0x1ffffc00, 0x3ffff800, 0x3ffff000, 0x3fffc000, 0x3fff0000, 0x3ffc0000, 0x1f800000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, },
};
// ( )
ull paren[2][61] = {
{ 0x7800, 0xfc00, 0x3fc00, 0x7fe00, 0xffe00, 0x1ffe00, 0x3ffc00, 0x7ff000, 0xffe000, 0x1ffc000, 0x1ff8000, 0x3ff0000, 0x3fe0000, 0x7fc0000, 0x7f80000, 0xff80000, 0xff00000, 0x1ff00000, 0x1fe00000, 0x1fe00000, 0x1fe00000, 0x3fe00000, 0x3fc00000, 0x3fc00000, 0x3fc00000, 0x3fc00000, 0x3fc00000, 0x3fc00000, 0x3fc00000, 0x3fc00000, 0x3fc00000, 0x3fc00000, 0x1fe00000, 0x1fe00000, 0x1fe00000, 0x1ff00000, 0xff00000, 0xff80000, 0xff80000, 0x7fc0000, 0x7fe0000, 0x3fe0000, 0x1ff0000, 0x1ff8000, 0xffe000, 0x7ff000, 0x3ff800, 0x1ffe00, 0xffe00, 0x7fe00, 0x3fe00, 0x1fc00, 0x7800, 0x1000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, },
{ 0x7800000, 0xfc00000, 0x1ff00000, 0x1ff80000, 0x1ffc0000, 0x1ffe0000, 0xfff0000, 0x3ff8000, 0x1ffc000, 0xffc000, 0x7fe000, 0x3ff000, 0x1ff000, 0xff800, 0x7f800, 0x7fc00, 0x3fc00, 0x3fe00, 0x1fe00, 0x1fe00, 0x1fe00, 0x1ff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0x1fe00, 0x1fe00, 0x1fe00, 0x3fe00, 0x3fc00, 0x7fc00, 0x7fc00, 0xff800, 0x1ff800, 0x3ff000, 0x3fe000, 0xffe000, 0x1ffc000, 0x3ff8000, 0x7ff0000, 0x1ffe0000, 0x1ffc0000, 0x1ff80000, 0x1ff00000, 0xfe00000, 0x7800000, 0x2000000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, },
};
// + - * /
ull ops[4][62] = {
{ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f0000, 0x3f8000, 0x3f8000, 0x3f8000, 0x3f8000, 0x3f8000, 0x3f8000, 0x3f8000, 0x3f8000, 0x3f8000, 0xffffffe0, 0xffffffe0, 0xffffffe0, 0xffffffe0, 0xffffffe0, 0xffffffe0, 0xffffffe0, 0x3f8000, 0x3f8000, 0x3f8000, 0x3f8000, 0x3f8000, 0x3f8000, 0x3f8000, 0x3f8000, 0x3f8000, 0x3f8000, 0x1f0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, },
{ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xffffffc0, 0x1ffffffe0, 0x1ffffffe0, 0x1ffffffe0, 0x1ffffffe0, 0x1ffffffe0, 0xffffffe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, },
{ 0x0, 0x0, 0x0, 0x0, 0x1e0000, 0x3f0000, 0x3f8000, 0x7f8000, 0x7f8000, 0x3f8000, 0x3f0000, 0x7c3f0780, 0x7e3f1fc0, 0xff9f7fc0, 0xfffeffc0, 0xffffffc0, 0xffffffc0, 0x7fffff80, 0x3fff000, 0x7f8000, 0xffe000, 0x1fff000, 0x7fbf800, 0xff3fc00, 0xff3fe00, 0x1fe1fe00, 0x1fe1fe00, 0xfe0fe00, 0x7c0fc00, 0x3803000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, },
{ 0x780, 0x7e0, 0xfe0, 0xfe0, 0x1fe0, 0x1fc0, 0x3fc0, 0x3f80, 0x7f80, 0x7f00, 0xff00, 0xfe00, 0x1fe00, 0x1fe00, 0x1fc00, 0x3fc00, 0x3f800, 0x7f800, 0x7f000, 0xff000, 0xfe000, 0x1fe000, 0x1fc000, 0x3fc000, 0x3f8000, 0x7f8000, 0x7f0000, 0x7f0000, 0xff0000, 0xfe0000, 0x1fe0000, 0x1fc0000, 0x3fc0000, 0x3f80000, 0x7f80000, 0x7f00000, 0xff00000, 0xfe00000, 0x1fe00000, 0x1fc00000, 0x3fc00000, 0x3fc00000, 0x3f800000, 0x7f800000, 0x7f000000, 0xff000000, 0xfe000000, 0x1fe000000, 0x1fc000000, 0xfc000000, 0x7c000000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, },
};
int x = 0, y = 0;
int minX = INF, minY = INF; // 对于某个特定连通块的最小/大 x 坐标与最小/大 y 坐标
int maxX = 0, maxY = 0;
int blockSize = 0; // 当前连通块大小,小于 100 的忽略不计
int minXBlocks[MAXW], minYBlocks[MAXW]; // 上述连通块的最小/大 x 坐标与最小/大 y 坐标
int maxXBlocks[MAXW], maxYBlocks[MAXW];
int xyPtr = 0; // 坐标数组的写指针
int speedX[] = { 0, 1, 0, -1 };
int speedY[] = { -1, 0, 1, 0 };
char a[MAXH][MAXW]; // 图像的复制品(要封路,不能用原图)
ull extracted[65]; // 连通块提取结果,转换为二值图形式
void reduceNoise(); // 降噪
void dfs(int x, int y); // 对一个连通块进行遍历
void extract(int index); // 提取单个字符
int main()
{
// 文件 IO,调试用
freopen("test.in", "r", stdin);
freopen("test.out", "w", stdout);
scanf("%d", &t);
scanf("%d%d", &w, &h);
for (rint i = 0; i < h; ++i)
scanf("%s", b[i]);
reduceNoise();
memcpy(a, b, sizeof(b));
// 打印降噪结果,调试用
// printf("%d\n", t);
// printf("%d %d\n", w, h);
// for (rint i = 0; i < h; ++i)
// printf("%s\n", a[i]);
for (rint j = 0; j < w; ++j)
{
for (rint i = 0; i < h; ++i)
{
if (a[i][j] == '#')
{
dfs(j, i);
if (blockSize >= 100)
{
minXBlocks[xyPtr] = minX;
minYBlocks[xyPtr] = minY;
maxXBlocks[xyPtr] = maxX;
maxYBlocks[xyPtr] = maxY;
xyPtr++;
}
blockSize = 0;
minX = minY = INF;
maxX = maxY = 0;
}
}
}
memcpy(a, b, sizeof(b));
for (rint i = 0; i < xyPtr; ++i)
{
extract(i);
// 打印提取结果,调试用
for (rint j = 0; j < h; ++j)
printf("%llu\n", extracted[j]);
// 识别
int width = maxXBlocks[i] - minXBlocks[i];
int height = maxYBlocks[i] - maxYBlocks[i];
}
// 打印 DFS 结果,调试用
// for (rint i = 0; i < h; ++i)
// printf("%s\n", a[i]);
fclose(stdin);
fclose(stdout);
return 0;
}
void reduceNoise()
{
// 样本分析
for (rint i = 0; i < h / 3; ++i)
{
for (rint j = 0; j < w / 3; ++j)
{
int dotNum = 0;
for (rint y = i * 3; y < i * 3 + 3; ++y)
{
for (rint x = j * 3; x < j * 3 + 3; ++x)
{
if (b[y][x] == '.')
dotNum++;
}
}
if (dotNum > 7)
{
for (rint y = i * 3; y < i * 3 + 3; ++y)
{
for (rint x = j * 3; x < j * 3 + 3; ++x)
b[y][x] = '.';
}
}
}
}
// 每行分析
for (rint i = 0; i < h; ++i)
{
for (rint j = 0; j < w - 2; ++j)
{
if (b[i][j] == '#' && b[i][j + 1] == '.' && b[i][j + 2] == '#')
b[i][j] = b[i][j + 1] = b[i][j + 2] = '#';
}
}
// 剩余区域
for (rint i = h; i >= h - h % 3; --i)
{
for (rint j = 0; j < w; ++j)
b[i][j] = '.';
}
for (rint i = w; i >= w - w % 3; --i)
{
for (rint j = 0; j < h; ++j)
b[j][i] = '.';
}
}
void dfs(int x, int y)
{
// “封路”
a[y][x] = '.';
// 求该连通块的最大 x,y 坐标
if (x < minX)
minX = x;
else if (x > maxX)
maxX = x;
if (y < minY)
minY = y;
else if (y > maxY)
maxY = y;
for (rint i = 0; i < 4; ++i)
{
int tx = x + speedX[i];
int ty = y + speedY[i];
if (tx >= 0 && tx < w && ty >= 0 && ty < h && a[ty][tx] == '#')
{
blockSize++;
dfs(tx, ty);
}
}
}
void extract(int index)
{
memset(extracted, 0, sizeof(extracted));
for (rint y = minYBlocks[index]; y <= maxYBlocks[index]; ++y)
{
for (rint x = minXBlocks[index]; x <= maxXBlocks[index]; ++x)
extracted[y - minYBlocks[index]] = extracted[y - minYBlocks[index]] << 1ULL + ((b[y][x] == '#') ? 1ULL : 0ULL);
}
}