牛客春招刷题训练营 - 2025.3.13 题解

活动地址:牛客春招刷题训练营 - 编程打卡活动

Easy 提取不重复的整数

简要题意

给一个整数,反向输出这个数,但跳过重复的数位。

Solution

字符串读入,反过来输出,输出时判一下有没有见过就好。

Code

void R()
{
	map<char,bool> vis;
	string s;
	cin>>s;
	for (int i=s.size()-1;i>=0;i--)
		if (!vis.count(s[i]))
		{
			vis[s[i]]=1;
			cout<<s[i];
		}
	return;
}

Medium 句子逆序

简要题意

给定一行若干个单词,将这些单词按相反顺序输出。

Solution

和 2025/3/10 的 Easy 同理,我们用 while (cin>>s) 读入。

然后插到一个 vector 里,reverse() 后输出就好。

Code

void R()
{
	string s;
	vector<string> t;
	while (cin>>s)
		t.push_back(s);
	reverse(t.begin(),t.end());
	for (auto &s:t)
		cout<<s<<' ';
	return;
}

Hard 迷宫问题

简要题意

给定一个 的四联通网格图,网格要么是通路要么是墙,找一条 的不撞墙的路径。

Solution

又是小模拟。

题目保证有解,我们直接 DFS 出一条路径,回溯时依次输出当前点就好。

注意到要求从起点输出到终点,正着搜需要把途径点先存下,倒着搜就不用了。

Code

void R()
{
	int n,m;
	cin>>n>>m;
	vector<vector<int>> a(n,vector<int>(m)),vis(a);
	vector<array<int,2>> ans;
	for (int i=0;i<n;i++)
		for (int j=0;j<m;j++)
			cin>>a[i][j];

	auto dfs=[&](auto &self,int x,int y)->bool
	{
		if (vis[x][y]||a[x][y]) return 0;
		else vis[x][y]=1;
		if (!x&&!y) goto ed;
		if (x&&self(self,x-1,y))
			goto ed;
		if (y&&self(self,x,y-1))
			goto ed;
		if (x+1<n&&self(self,x+1,y))
			goto ed;
		if (y+1<m&&self(self,x,y+1))
			goto ed;
		return 0;

		ed:ans.push_back({x,y});
		return 1;
	};

	dfs(dfs,n-1,m-1);
	for (auto [x,y]:ans)
		cout<<'('<<x<<','<<y<<")\n";
	return;
}
#牛客春招刷题训练营#
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务