杭电1495
题目 AC代码
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
int w[3],flag,state[100][100][100];
struct cond {
int v[3];
int step;
};
void bfs()
{
queue<cond>qu;
cond first,next;
first.step=0;
first.v[0]=w[0];
first.v[1]=first.v[2]=0;
qu.push(first);
while(!qu.empty())
{
first=qu.front();
qu.pop();
if(first.v[0]==0||first.v[1]==0||first.v[2]==0)
{
for(int i=0; i<3; i++)
if(first.v[i]*2==w[0])
{
flag=1;
cout<<first.step<<endl;
return;
}
}
for(int i=0; i<3; i++)
for(int j=0; j<3; j++)
{
if(i!=j) {
next=first;
int mind=min(first.v[i],w[j]-first.v[j]);
next.v[i]=first.v[i]-mind;
next.v[j]=first.v[j]+mind;
next.step=first.step+1;
if(!state[next.v[0]][next.v[1]][next.v[2]]) {
qu.push(next);
state[next.v[0]][next.v[1]][next.v[2]]=1;
}
}
}
}
}
int main()
{
cin>>w[0]>>w[1]>>w[2];
while(w[0]||w[1]||w[2])
{
if(w[0]%2==1)
{
cout<<"NO"<<endl;
}
else{
flag=0;
memset(state,0,sizeof(state));
state[w[0]][0][0]=1;
bfs();
if(!flag)
cout<<"NO"<<endl;
}
cin>>w[0]>>w[1]>>w[2];
}
return 0;
}
解题思路
- 用一个数组储存三个杯子的状态
- 用一个三维数组来标记此状态是否已经被访问
采用三维数字标记的好处是状态唯一,不用判断是否与前面状态相同, 通过数组下标即可确定 - 采用BFS遍历
- if(w[0]%2==1)
{ cout<<“NO”<<endl; }提前判断减少复杂度
出现错误
没有想到用三维数组存储标记 使用多次结构体代码冗长,且初始采用分类谈论并未简化代码,导致重复代码很多(解决方法可以采用函数包裹) 成功条件也采用暴力分类讨论,性价比很低
|