http://tjuacm.chaosheng.top/problem.php?id=1267
参考 https://blog.csdn.net/tigerisland45/article/details/52207660
用到的是BFS+模拟
对于很多求最快,最短,最少的问题,都可以用bfs来做
之前几题求的是所有情况,所以用的是dfs。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; const int N = 110; int s, n, m, avg; bool vis[N][N][N]; struct node{ int s, n, m; int step; }; int bfs(){ queue<node> q; node f; f.s = s; f.n = 0; f.m = 0; f.step = 0; q.push(f); vis[f.s][f.n][f.m] = true; while(!q.empty()){ f = q.front(); q.pop(); //满足条件 if((f.s == f.n && f.n == avg) || (f.s == f.m && f.m == avg) || (f.n == f.m && f.n == avg)){ return f.step; } node v; //新的状态 //s->n if(f.s && f.n < n){ if(f.s > n - f.n) { //f.s大于 n剩余容量 v.s = f.s - (n - f.n); v.n = n; v.m = f.m; }else{ v.s = 0; v.n = f.n + f.s; v.m = f.m; } if(!vis[v.s][v.n][v.m]) { vis[v.s][v.n][v.m] = true; v.step = f.step + 1; q.push(v); } } //s->m if(f.s && f.m < m){ if(f.s > m - f.m) { //f.s大于 m剩余容量 v.s = f.s - (m - f.m); v.n = f.n; v.m = m; }else{ v.s = 0; v.n = f.n; v.m = f.m + f.s; } if(!vis[v.s][v.n][v.m]) { vis[v.s][v.n][v.m] = true; v.step = f.step + 1; q.push(v); } } //n->s if(f.n && f.s < s){ if(f.n > s - f.s) { //f.n大于 s剩余容量 v.s = s; v.n = f.n - (s - f.s); v.m = f.m; }else{ v.s = f.s + f.n; v.n = 0; v.m = f.m; } if(!vis[v.s][v.n][v.m]) { vis[v.s][v.n][v.m] = true; v.step = f.step + 1; q.push(v); } } //n->m if(f.n && f.m < m){ if(f.n > m - f.m) { //f.n大于 m剩余容量 v.s = f.s; v.n = f.n - (m - f.m); v.m = m; }else{ v.s = f.s; v.n = 0; v.m = f.m + f.n; } if(!vis[v.s][v.n][v.m]) { vis[v.s][v.n][v.m] = true; v.step = f.step + 1; q.push(v); } } //m->s if(f.m && f.s < s){ if(f.m > s - f.s) { //f.n大于 s剩余容量 v.s = s; v.n = f.n; v.m = f.m - (s - f.s); }else{ v.s = f.s + f.m; v.n = f.n; v.m = 0; } if(!vis[v.s][v.n][v.m]) { vis[v.s][v.n][v.m] = true; v.step = f.step + 1; q.push(v); } } //m->n if(f.m && f.n < n){ if(f.m > n - f.n) { //f.n大于 m剩余容量 v.s = f.s; v.n = n; v.m = f.m - (n - f.n); }else{ v.s = f.s; v.n = f.n + f.m; v.m = 0; } if(!vis[v.s][v.n][v.m]) { vis[v.s][v.n][v.m] = true; v.step = f.step + 1; q.push(v); } } } return -1; } int main(){ while(cin >> s >> n >> m){ if(s == 0 && n == 0 && m == 0) break; if(s % 2 == 1) { printf("NO\n"); continue; } avg = s / 2; memset(vis, false, sizeof(vis)); int ans = bfs(); if(ans == -1) printf("NO\n"); else printf("%d\n", ans); } return 0; }