标签:
看了别人的许多代码,长的让人发指,感觉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