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;
}
京公网安备 11010502036488号