求调
324095
KevTheDev楼主2021/1/2 13:34

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);
	}
}
2021/1/2 13:34
加载中...