- 【具体问题具体分析】通过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;
}