题目链接:点击打开链接
代码:
#include<stdio.h>
#include<queue>
#include<algorithm>
using namespace std;
#include<string.h>
struct node
{
int v[3],step;
} ini,temp;
int a[3],ed[3],vis[1010][1010];
void bfs()
{
queue<node>q;
memset(vis,0,sizeof(vis));
ini.v[0]=a[0];
ini.step=ini.v[1]=ini.v[2]=0;
q.push(ini);
vis[a[0]][0]=1;
这个一定不能忘记,标记出现过的状态!!!!
while(!q.empty())
{
int i,j;
ini=q.front();
q.pop();
for(i=0; i<3&&ini.v[i]>=0; i++)
{
个人觉得,这里判不判断都无所谓!
for(j=0; j<3; j++)
if(i!=j)
{
temp=ini;
if(ini.v[0]==ed[0]&&ini.v[1]==ed[1])
{
printf("%d\n",ini.step);
return ;
结束函数;
}
if(ini.v[i]+ini.v[j]<=a[j])
{
temp.v[i]=0;
temp.v[j]=ini.v[j]+ini.v[i];
}
else
{
temp.v[i]=ini.v[i]+ini.v[j]-a[j];
temp.v[j]=a[j];
}
if(!vis[temp.v[0]][temp.v[1]])
{
temp.step=ini.step+1;
if(temp.v[0]==ed[0]&&temp.v[1]==ed[1])
{
printf("%d\n",temp.step);
return ;
}
vis[temp.v[0]][temp.v[1]]=1;
q.push(temp);
}
}
}
}
printf("-1\n");
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
for(int i=0; i<3; i++)
scanf("%d",&a[i]);
for(int i=0; i<3; i++)
scanf("%d",&ed[i]);
bfs();
}
return 0;
}
每次只可以倒一次水,枚举所有的倒水的状态,直接广搜(so easy,大二了啊,再不so easy 有点说不过去了啊)