京东笔试,算法岗第二题解答

#include<vector>
#include<iostream>
#include<string>
using namespace std;


void makeroute(vector<string>& str, int n, int m, int i, int j)
{
	if (i < 0 || i >= n || j < 0 || j >= m) return;
	if (str[i][j]!='1'&&str[i][j] != '#')
	{
		str[i][j] = '1';
		makeroute(str, n, m, i - 1, j);
		makeroute(str, n, m, i + 1, j);
		makeroute(str, n, m, i, j - 1);
		makeroute(str, n, m, i, j + 1);
	}
}

bool canbreak(vector<string>& str, int n, int m)
{
	int si, sj;
	for (int i = 0;i < n;i++)
	{
		for (int j = 0;j < m;j++)
		{
			if (str[i][j] == 'S') {
				si = i;
				sj = j;
				break;
			}
		}
	}
	vector<string> ss;
	for (int t = 0;t < 3;t++) {
		for (int i = 0;i < n;i++){
			string tmp = str[i] + str[i] + str[i];
			ss.push_back(tmp);
		}
	}
	makeroute(ss, 3*n, 3*m, n+si, m+sj);
	for (int i = 0;i < 3 * n;i++)
		if (ss[i][0] == '1' || ss[i][3 * m - 1] == '1') return true;
	for (int j = 0;j < 3 * m;j++)
		if (ss[0][j] == '1' || ss[3 * n - 1][j] == '1') return true;
	return false;
}

int main()
{
	int t;
	cin >> t;
	vector<string> res;
	for (int i = 0;i < t;i++)
	{
		int n, m;
		cin >> n >> m;
		vector<string> str(n);
		for (int i = 0;i < n;i++)
			cin >> str[i];
		if (canbreak(str, n, m)) res.push_back("Yes");
		else res.push_back("No");
	}
	for (int i = 0;i < t;i++)
		cout << res[i] << endl;
	return 0;
}
数组复制了九份,从中间的'S'往外找连通点,如果最后能通到边界,就是能成功,AC
#京东##笔试题目#
全部评论
真的是大佬
点赞 回复 分享
发布于 2019-08-24 21:27
神仙
点赞 回复 分享
发布于 2019-08-24 21:30
神仙
点赞 回复 分享
发布于 2019-08-24 21:35
用python复制九份超时😂
点赞 回复 分享
发布于 2019-08-24 21:40
python复制9份超时
点赞 回复 分享
发布于 2019-08-24 21:41

相关推荐

点赞 评论 收藏
分享
评论
6
24
分享

创作者周榜

更多
牛客网
牛客企业服务