轴指向右侧,正
您将依次对
能否选择旋转方向,使机器人在进行
如果可以,请确定每次操作应选择顺时针还是逆时针方向。
首先可以很快速的观察到一个问题,每当机器人在一个坐标轴上行走一次之后,它会在下一次行走前左转或右转90度,这将决定每两次相邻的行走不在同一个坐标轴之上。
因此对于输入数据而言,奇数位的数据只可能在
接着分析能不能接着这个巧合将
所以,只要X的Y的每一步的正负走向决定了,具体是左转还是右转是一个关于X或Y的函数,不会因为分开求解而变化。
接下来就可以对
现在,问题已经转化成了,给定
再观察一下数据范围(
但是,纯纯的深度优先搜索的话,可能的总情况数是
这就是本题接下来的精髓:二分搜索
二分搜索,顾名思义。对于初始状态和结束状态都明确的搜索,可以从两头分别搜索数据的一半,最后查找两棵搜索树有没有重复的节点。如果有,证明这两条一半的路径可以合并为从起点到终点的一条完整的路径;否则,该路径不存在。
对于这个题,就可以先搜索给定数字的前
因为两个大小为
对于两坐标轴都搜索完之后,查询合并后路径
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n, X, Y;
vector<ll> x, y;
vector<ll> ans1, ans2, step, stepfinalx, stepfinaly;
vector<vector<ll>> step1, step2;
ll sizex, sizey;
map<ll, ll> mp;
void judge(ll i, ll x, ll y)
{
if (i & 1)
{
if (x * y == 1)
cout << "R";
else if (x * y == -1)
cout << "L";
}
else
{
if (x * y == 1)
cout << "L";
else if (x * y == -1)
cout << "R";
}
}
void dfs1(vector<ll> x, ll i, ll size, ll ans)
{
if (i == size)
{
ans1.push_back(ans);
step1.push_back(step);
return;
}
step.push_back(1);
dfs1(x, i + 1, size, ans + x[i]);
step.pop_back();
step.push_back(-1);
dfs1(x, i + 1, size, ans - x[i]);
step.pop_back();
return;
}
void dfs2(vector<ll> x, ll i, ll size, ll ans)
{
if (i == size)
{
ans2.push_back(ans);
step2.push_back(step);
return;
}
step.push_back(1);
dfs2(x, i + 1, size, ans + x[i]);
step.pop_back();
step.push_back(-1);
dfs2(x, i + 1, size, ans - x[i]);
step.pop_back();
return;
}
int main()
{
cin >> n >> X >> Y;
for (ll i = 1; i <= n; i++)
{
ll a;
cin >> a;
if (i & 1)
y.push_back(a);
else
x.push_back(a);
}
sizex = x.size();
sizey = y.size();
dfs1(x, 0, sizex / 2, 0);
for (ll i = 0; i < ans1.size(); i++)
mp[X - ans1[i]] = i;
dfs2(x, sizex / 2, sizex, 0);
for (ll i = 0; i < ans2.size(); i++)
{
auto it = mp.find(ans2[i]);
if (it != mp.end())
{
stepfinalx.insert(stepfinalx.begin(), step1[(*it).second].begin(), step1[(*it).second].end());
stepfinalx.insert(stepfinalx.end(), step2[i].begin(), step2[i].end());
break;
}
}
step1.clear();
step2.clear();
ans1.clear();
ans2.clear();
mp.clear();
dfs1(y, 0, sizey / 2, 0);
for (ll i = 0; i < ans1.size(); i++)
mp[Y - ans1[i]] = i;
dfs2(y, sizey / 2, sizey, 0);
for (ll i = 0; i < ans2.size(); i++)
{
auto it = mp.find(ans2[i]);
if (it != mp.end())
{
stepfinaly.insert(stepfinaly.begin(), step1[(*it).second].begin(), step1[(*it).second].end());
stepfinaly.insert(stepfinaly.end(), step2[i].begin(), step2[i].end());
break;
}
}
if (!(stepfinalx.empty() || stepfinaly.empty()))
{
cout << "Yes" << endl;
ll finalstep[81];
memset(finalstep, 0, sizeof(finalstep));
for (ll i = 0; i < stepfinaly.size(); i++)
{
finalstep[2 * i + 1] = stepfinaly[i];
}
for (ll i = 0; i < stepfinalx.size(); i++)
{
finalstep[2 * i + 2] = stepfinalx[i];
}
finalstep[0] = 1;
for (ll i = 0; i < n; i++)
{
judge(i, finalstep[i], finalstep[i + 1]);
}
}
else
{
cout << "No" << endl;
}
cout<<endl;
system("pause");
return 0;
}
请我喝杯咖啡吧~