一看题目就知道是用bfs 然而....
WA WA WA
勤能补拙。
寒假补解释
AC代码:
#include<iostream>
#include<queue>
using namespace std;
struct node{
int asum, bsum, csum;
int time;
};
int a, b, c;
int mr[101][101];
int bfs(){
memset(mr, 0, sizeof(mr));
queue<node> q;
node m, n;
int i;
int f = a / 2.0;
m.asum = a;
m.bsum = 0;
m.csum = 0;
m.time = 0;
mr[m.asum][m.bsum] = 1;
q.push(m);
while (!q.empty()){
m = q.front();
q.pop();
for (i = 0; i < 6; i++){
if (i == 0){ // a->b
if (m.bsum == 0 && m.asum >= b){
n.asum = m.asum - b;
n.bsum = b;
}
else if (m.asum <= (b - m.bsum)){
n.asum = 0;
n.bsum = m.asum + m.bsum;
}
else{
n.asum = m.asum - (b - m.bsum);
n.bsum = b;
}
n.csum = m.csum;
n.time = m.time + 1;
}
else if (i == 1){ // a->c
if (m.csum == 0 && m.asum >= c){
n.asum = m.asum - c;
n.csum = c;
}
else if (m.asum <= (c - m.csum)){
n.asum = 0;
n.csum = m.asum + m.csum;
}
else{
n.asum = m.asum - (c - m.csum);
n.csum = c;
}
n.bsum = m.bsum;
n.time = m.time + 1;
}
else if (i == 2){ //b->a
n.asum = m.asum + m.bsum;
n.bsum = 0;
n.csum = m.csum;
n.time = m.time + 1;
}
else if (i == 3){//b->c
if (m.csum == 0 && m.bsum >= c){
n.bsum = m.bsum - c;
n.csum = c;
}
else if (m.bsum <= (c - m.csum)){
n.bsum = 0;
n.csum = m.bsum + m.csum;
}
else{
n.bsum = m.bsum - (c - m.csum);
n.csum = c;
}
n.asum = m.asum;
n.time = m.time + 1;
}
else if (i == 4){ //c->a
n.asum = m.asum + m.csum;
n.csum = 0;
n.bsum = m.bsum;
n.time = m.time + 1;
}
else { //c->b
if (m.bsum == 0 && m.csum >= b){
n.csum = m.csum - b;
n.bsum = b;
}
else if (m.csum <= (b - m.bsum)){
n.csum = 0;
n.bsum = m.bsum + m.csum;
}
else{
n.csum = m.csum - (b - m.bsum);
n.bsum = b;
}
}
if (n.bsum > b || n.csum > c || n.bsum < 0 || n.csum < 0 || n.asum < 0 || n.asum > a){
continue;
}
if (mr[n.asum][n.bsum] == 1){
continue;
}
mr[n.asum][n.bsum] = 1;
if (n.asum == f && n.bsum == f){
return n.time;
}
q.push(n);
}
}
return 0;
}
int main(){
int result;
while (cin >> a >> b >> c && a && b && c){
if (a % 2 != 0){
cout << "NO" << endl;
continue;
}
int temp = b;
if (c > temp){
b = c;
c = temp;
}
result = bfs();
if (result == 0){
cout << "NO" << endl;
}
else{
cout << result << endl;
}
}
return 0;
}