Sheep Eat Wolves

D06發表於2024-10-07
  • 【具體問題具體分析】透過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;
}