看了别人的许多代码,长的让人发指,感觉70行就能搞定的代码写了上百行?...
6种情况可以用循环解决
#include<iostream>
#include<queue>
#include<cstring>
#define maxn 100+5
using namespace std;
int n[3];
int vs;
int visit[maxn][maxn][maxn];//三位数组记录有木有走过
int dir[6][3]={{0,1,2},{1,0,2},{1,2,0},{2,1,0},{0,2,1},{2,0,1}};
int flag;
struct stu
{
int v[3];//0表示s,1,2分别表示n,m,之所以这样,是因为方便之后用循环处理6种情况
int sum;
};
void bfs()
{
stu x,y;
queue<stu>mapp;
x.v[0]=n[0];x.v[1]=0;x.v[2]=0,x.sum=0;
mapp.push(x);
while(mapp.size())
{
x=mapp.front();
mapp.pop();
if((x.v[0]==x.v[1]&&x.v[1]==vs)||(x.v[0]==x.v[2]&&x.v[2]==vs)||(x.v[1]==x.v[2]&&x.v[2]==vs))
{
flag=0;cout<<x.sum<<endl;return;
}
visit[x.v[0]][x.v[1]][x.v[2]]=1;
for(int i=0;i<6;i++)
{
int p=dir[i][0],q=dir[i][1],r=dir[i][2];
int vv=x.v[p]+x.v[q];
if(vv>n[q])
{
y.v[q]=n[q];
y.v[p]=vv-n[q];
}
else
{
y.v[q]=vv;
y.v[p]=0;
}
y.v[r]=x.v[r];
y.sum=x.sum+1;
if(visit[y.v[0]][y.v[1]][y.v[2]]) continue;
mapp.push(y);
}
}
}
int main()
{
cin.sync_with_stdio(false);
while(cin>>n[0]>>n[1]>>n[2]&&n[0]&&n[1]&&n[2])
{
if(n[0]%2)//剪个枝,因为容器都是整数,所以不可能倒出小数来
{
cout<<"NO"<<endl;continue;
}
flag=1;
vs=n[0]/2;
memset(visit,0,sizeof(visit));
bfs();
if(flag) cout<<"NO"<<endl;
}
return 0;
}
原文:http://blog.csdn.net/zafkiel_nightmare/article/details/45844561