求调: dfs
  • 板块灌水区
  • 楼主hdkghc
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/5/13 11:49
  • 上次更新2024/5/13 17:09:44
查看原帖
求调: dfs
346134
hdkghc楼主2024/5/13 11:49

RT,

int dx[] = {-1, 1, 0, 0, 0}, dy[] = {0, 0, -1, 1, 0};
// udlr
mt19937 mt;
vector<int> inv = {-1};
map<pair<int, int>, vector<int>> mem;

// TODO : fix bug
vector<int> dfsmap(pos now, pos man)
{
	vector<int> ret = inv;
	if (man.mapx != now.mapx || man.mapy != now.mapy)
		for (int i = 0; i < 4; i++)
		{
			pos n = now;
			n.mapx += dx[i];
			n.mapy += dy[i];
			pair<int, int> pii = make_pair(n.mapx, n.mapy);
			if (whole[now.mapx][now.mapy] & (1 << (3 - i))) continue;
			if (whole[n.mapx][n.mapy] & 16) continue; // 16 : visited
			vector<int> tmp = inv;
			if (mem[pii].empty())
			{
				whole[n.mapx][n.mapy] |= 16;
				tmp.clear();
				mem[pii] = tmp = dfsmap(n, man);
				if (tmp != inv) tmp.insert(tmp.begin(), i);
				whole[n.mapx][n.mapy] &= ~16;
			}
			else
			{
				tmp.clear();
				tmp = mem[pii];
				if(tmp != inv) tmp.insert(tmp.begin(), i);
			}
			if (ret == inv || tmp.size() < ret.size()) ret = tmp;
//			Sleep(2);
		}
	else ret = {5};
	return ret;
}
vector<int> dfs(pos now, pos man)
{
	for(int i = 0; i < WLINE; i++)
	{
		for(int j = 0; j < WCOL; j++)
		{
			whole[i][j] &= ~16;
		}
	}
	vector<int> ret;
	whole[now.mapx][now.mapy] |= 16;
	ret = dfsmap(now, man);
	whole[now.mapx][now.mapy] &= ~16;
	return ret;
}
2024/5/13 11:49
加载中...