标签:hdu 1495 非常可乐 bfs 搜索
7 4 3 4 1 3 0 0 0
NO 3
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<string> #include<algorithm> #include<cstdlib> #include<set> #include<queue> #include<stack> #include<vector> #include<map> #define N 100010 #define Mod 10000007 #define lson l,mid,idx<<1 #define rson mid+1,r,idx<<1|1 #define lc idx<<1 #define rc idx<<1|1 const double EPS = 1e-11; const double PI = acos ( -1.0 ); const double E = 2.718281828; typedef long long ll; const int INF = 1000010; using namespace std; int s,n,m; bool vis[111][111][111],flag; struct node { int s,n,m; int num; }; queue<node>que; void bfs() { while(que.size()) que.pop(); memset(vis,0,sizeof vis); node a,t; a.s=s,a.n=0,a.m=0,a.num=0; que.push(a); vis[s][0][0]=1; while(que.size()) { a=que.front(); que.pop(); if(a.s==a.n&&a.m==0||(a.s==0&&a.n==a.m)||(a.n==0&&a.s==a.m)) { flag=0; cout<<a.num<<endl; return; } if(a.s>0)//s->n,s->m { if(a.n<n)//s->n { int tt=n-a.n; if(a.s>tt)//n可以倒满 { t.s=a.s-tt; t.n=n; t.m=a.m; } else//不可以倒满 { t.s=0; t.n=a.s+a.n; t.m=a.m; } if(!vis[t.s][t.n][t.m]) { t.num=a.num+1; que.push(t); vis[t.s][t.n][t.m]=1; } } if(a.m<m) { int tt=m-a.m; if(a.s>tt) { t.s=a.s-tt; t.n=a.n; t.m=m; } else { t.s=0; t.n=a.n; t.m=a.m+a.s; } if(!vis[t.s][t.n][t.m]) { t.num=a.num+1; que.push(t); vis[t.s][t.n][t.m]=1; } } } if(a.n>0) { if(a.s<s) { int tt=s-a.s; if(a.n>tt) { t.n=a.n-tt; t.m=a.m; t.s=s; } else { t.n=0; t.m=a.m; t.s=a.s+a.n; } if(!vis[t.s][t.n][t.m]) { t.num=a.num+1; que.push(t); vis[t.s][t.n][t.m]=1; } } if(a.m<m) { int tt=m-a.m; if(a.n>tt) { t.n=a.n-tt; t.m=m; t.s=a.s; } else { t.n=0; t.m=a.m+a.n; t.s=a.s; } if(!vis[t.s][t.n][t.m]) { t.num=a.num+1; que.push(t); vis[t.s][t.n][t.m]=1; } } } if(a.m>0) { if(a.s<s) { int tt=s-a.s; if(a.m>tt) { t.n=a.n; t.m=a.m-tt; t.s=s; } else { t.n=a.n; t.m=0; t.s=a.s+a.m; } if(!vis[t.s][t.n][t.m]) { t.num=a.num+1; que.push(t); vis[t.s][t.n][t.m]=1; } } if(a.n<n) { int tt=n-a.n; if(a.m>tt) { t.n=n; t.m=a.m-tt; t.s=a.s; } else { t.n=a.n+a.m; t.m=0; t.s=a.s; } if(!vis[t.s][t.n][t.m]) { t.num=a.num+1; que.push(t); vis[t.s][t.n][t.m]=1; } } } } } int main() { while(cin>>s>>n>>m&&(s+n+m)) { if(s%2)//奇数不能平分 { cout<<"NO\n"; continue; } flag=1; bfs(); if(flag) cout<<"NO"<<endl; } return 0; }
标签:hdu 1495 非常可乐 bfs 搜索
原文地址:http://blog.csdn.net/acm_baihuzi/article/details/42362013