这道题还记得是我当年学广搜的时候做过。
如今再做,做了一个$dfs$版本的,比较简单,直接搞就可以了。
广搜的话,用结构体保存,然后塞到$queue$里面就可以了。
1 /* 2 ID: Starry21 3 LANG: C++ 4 TASK: ariprog 5 */ 6 #include<iostream> 7 #include<string> 8 #include<cstdio> 9 #include<cstring> 10 #include<vector> 11 #include<algorithm> 12 using namespace std; 13 #define N 25 14 #define ll long long 15 #define INF 0x3f3f3f3f 16 int a,b,c; 17 bool vis[25]; 18 bool pd[N][N][N]; 19 void dfs(int A,int B,int C) 20 { 21 if(pd[A][B][C]) return ; 22 pd[A][B][C]=1; 23 if(A!=0) 24 { 25 int delta=min(A,b-B); 26 if(delta!=0) dfs(A-delta,B+delta,C); 27 delta=min(A,c-C); 28 if(delta!=0) dfs(A-delta,B,C+delta); 29 } 30 if(B!=0) 31 { 32 int delta=min(B,a-A); 33 if(delta!=0) dfs(A+delta,B-delta,C); 34 delta=min(B,c-C); 35 if(delta!=0) dfs(A,B-delta,C+delta); 36 } 37 if(C!=0) 38 { 39 int delta=min(C,b-B); 40 if(delta!=0) dfs(A,B+delta,C-delta); 41 delta=min(C,a-A); 42 if(delta!=0) dfs(A+delta,B,C-delta); 43 } 44 if(A==0) 45 { 46 vis[C]=1; 47 return ; 48 } 49 return ; 50 } 51 int main() 52 { 53 //freopen("ariprog.in","r",stdin); 54 //freopen("ariprog.out","w",stdout); 55 scanf("%d %d %d",&a,&b,&c); 56 dfs(0,0,c); 57 for(int i=0;i<=20;i++) 58 if(vis[i]) 59 printf("%d ",i); 60 return 0; 61 }