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 @   HappyBobb  阅读(7)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示