题目链接
- 【具体问题具体分析】通过bfs遍历状态空间
- STL tuple(元组)
- j>i+q 隐含前提:i,j>0(理解式子,自己写出来)
点击查看代码
#include <bits/stdc++.h>
using namespace std;
int x,y,p,q;
bool v[105][105][2];
bool check(int i,int j,int opt)
{
if(v[i][j][opt]==true)
{
return false;
}
if(!opt)
{
i=x-i;
j=y-j;
}
if(i>0&&j>0&&j>i+q)
{
return false;
}
return true;
}
typedef tuple<int,int,int,int> t1;
queue<t1>cur;
void dp(int i,int j,int opt,int step)
{
cur.push(make_tuple(i,j,opt,step));
v[i][j][opt]=true;
while(!cur.empty())
{
t1 n1=cur.front();
cur.pop();
int i=get<0>(n1),j=get<1>(n1),opt=get<2>(n1),step=get<3>(n1);
if(i==0)
{
cout<<step<<endl;
return;
}
if(opt==0)
{
for(int k=0;k<=i;k++)
{
for(int l=0;l<=j&&k+l<=p;l++)
{
if(check(i-k,j-l,1))
{
v[i-k][j-l][1]=true;
cur.push((t1){i-k,j-l,1,step+1});
}
}
}
}
else
{
for(int k=0;k<=x-i;k++)
{
for(int l=0;l<=y-j&&k+l<=p;l++)
{
if(check(i+k,j+l,0))
{
v[i+k][j+l][0]=true;
cur.push((t1){i+k,j+l,0,step+1});
}
}
}
}
}
cout<<-1<<endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>x>>y>>p>>q;
dp(x,y,0,0);
return 0;
}