P7225 [RC-04] 走迷宫

题意:

交互题,有一个地图,里面有些是障碍,有些是空地。需要实现函数 string find_out_map(int x, int y, int n),其中 xy 是一个地图的某个位置的坐标,这个位置没有障碍。同时可以调用 bool move_to(char c) 表示从当前位置往 WASD 走是否可行(即上左下右)。返回的 string 是地图哪些地方是障碍,哪些是空地。

解法:

这道题广搜深搜均可,但是这是个交互题,所以我们要注意一些交互题的问题。

我这里采取深搜解决,考虑从起点开始走四联通深搜,每次调用 move_to 函数,move_to 函数会更改当前在地图上的位置,所以要进行回溯使得位置不变。

注意,交互库不能询问过多,不然会显示 too many operations,所以我们要避免同一个点走两次,也就是在深搜过程中标记,也就是记录 vis 数组。

其余的就很简单了,注意 extern "C" 的使用,同时,交互题不需要先 int main()cincout 等语句,只需要在函数前加上 extern "C" 即可,注意函数名的问题。

代码:

#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
using namespace std;

const int N = 505;
char c[N][N];

int dx[] = { -1, 0, 1, 0 };
int dy[] = { 0, -1, 0, 1 };
bool flag[N][N];
string pos = "WASD";

extern "C" bool move_to(char);

extern "C" void dfs(int x, int y)
{
	flag[x][y] = true;
	for (int i = 0; i < 4; i++)
	{
		int nx = x + dx[i], ny = y + dy[i];
		if (flag[nx][ny]) continue;
		if (move_to(pos[i]))
		{
			c[nx][ny] = false;
			dfs(nx, ny);
			if (pos[i] == 'W') move_to('S');
			else if (pos[i] == 'S') move_to('W');
			else if (pos[i] == 'A') move_to('D');
			else if (pos[i] == 'D') move_to('A');
		}
		else c[nx][ny] = true;
		flag[nx][ny] = true; // 注意写在 if else 后
	}
}

extern "C" string find_out_map(int x, int y, int n)
{
	memset(flag, false, sizeof(flag));
	memset(c, true, sizeof(c));
	c[x][y] = 0;
	dfs(x, y);
	string ans = "";
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= n; j++)
		{
			ans.push_back(c[i][j] ? '1' : '0'); // 其实第 i 位表示什么什么行列转化国立就是 n * n 的矩阵顺序排列
		}
	}
	return ans;
}
posted @ 2022-01-31 16:13  HappyBobb  阅读(13)  评论(0)    收藏  举报  来源