HDU 1495 非常可乐([kuangbin带你飞]专题一 简单搜索)
题目大意:题目连接
给你杯子 S,N,M 只有s中有可乐,问他们能平分吗;
解题思路:
搜索,计算达到每一步所要的操作次数,
#include<stdio.h> #include<string.h> #include<queue> using namespace std; struct node{ int a[3]; int setp; }info; const int maxn =100+5; int h[maxn][maxn][maxn]; int dfs(int s,int n,int m){ queue<node> q; while(!q.empty()) q.pop(); int ss[3]; ss[0]=s,ss[1]=n,ss[2]=m; memset(h,0,sizeof(h)); h[s][0][0]=1; info.a[0]=s,info.a[1]=0,info.a[2]=0; info.setp=0; q.push(info); int half=s/2; while(!q.empty()){ node tmp=q.front(); q.pop(); if((tmp.a[0]==half && tmp.a[1]==half) || (tmp.a[0]==half && tmp.a[2]==half) || (tmp.a[1]==half && tmp.a[2]==half)) return tmp.setp; tmp.setp++; for(int i=0;i<3;i++){ if(tmp.a[i]>0) for(int j=0;j<3;j++){ if(i==j) continue; info=tmp; if(info.a[i]< ss[j]-info.a[j]){ info.a[j]+=info.a[i]; info.a[i]=0; }else{ info.a[i]-=(ss[j]-info.a[j]); info.a[j]=ss[j]; } if(!h[info.a[0]][info.a[1]][info.a[2]]){ h[info.a[0]][info.a[1]][info.a[2]]=1; q.push(info); } } } } return 0; } int main(int argc, char const *argv[]) { int s,n,m; while(scanf("%d%d%d",&s,&n,&m)){ if(s==0 && n==0 && m==0) break; if(s%2==1){ printf("NO\n");continue;} int ans=dfs(s,n,m); if(ans) printf("%d\n",ans); else printf("NO\n"); } return 0; }