#include<iostream> #include<algorithm> #include<math.h> #include<stdlib.h> #include<string.h> #include<stdio.h> #include<ctype.h> #include<limits.h> #include<queue> #include<stack> using namespace std; #define max(a, b) a>b?a:b #define min(a, b) a<b?a:b #define N 110 typedef struct maze { int a, b, c, step; } MAZE; int s, n, m, visit[N][N][N]; void BFS(); int main() { while(scanf("%d%d%d", &s, &n, &m), s+n+m) { if(s%2!=0) printf("NO\n"); else BFS(); } return 0; } void BFS() { queue<MAZE>que; memset(visit, 0, sizeof(visit)); MAZE p, q; p.a=s; p.b=0; p.c=0; p.step=0; visit[p.a][p.b][p.c]=1; que.push(p); while(!que.empty()) { p=que.front(); que.pop(); if((p.a==p.b&&p.c==0)||(p.a==p.c&&p.b==0)||(p.b==p.c&&p.a==0)) { printf("%d\n", p.step); return; } q=p; if(p.a!=0) { if(p.a>n-p.b)//也就是说p.a还有剩余 { //q= (MAZE) {p.a-n+p.b, n, p.c, p.step+1}; q.a=p.a-n+p.b; q.b=n; q.c=p.c; q.step=p.step+1; } else { //q= (MAZE) {0, p.a+p.b, p.c, p.step+1}; q.a=0; q.b=p.a+p.b; q.c=p.c; q.step=p.step+1; } if(visit[q.a][q.b][q.c]==0) { visit[q.a][q.b][q.c]=1; que.push(q); } if(p.a>m-p.c)//也就是说p.a还有剩余 { // q=(MAZE) {p.a-m+p.c, p.b, m, p.step+1}; q.a=p.a-m+p.c; q.b=p.b; q.c=m; q.step=p.step+1; } else { // q= (MAZE) {0, p.b, p.c+p.a, p.step+1}; q.a=0; q.b=p.b; q.c=p.c+p.a; q.step=p.step+1; } if(visit[q.a][q.b][q.c]==0) { visit[q.a][q.b][q.c]=1; que.push(q); } } if(p.b!=0) { if(p.b>s-p.a)//也就是说p.b还有剩余 { //q= (MAZE) {s, p.b-s+p.a, p.c, p.step+1}; q.a=s; q.b=p.b-s+p.a; q.c=p.c; q.step=p.step+1; } else { //q= (MAZE) {p.a+p.b, 0, p.c, p.step+1}; q.a=p.a+p.b; q.b=0; q.c=p.c; q.step=p.step+1; } if(visit[q.a][q.b][q.c]==0) { visit[q.a][q.b][q.c]=1; que.push(q); } if(p.b>m-p.c)//也就是说p.b还有剩余 { //q= (MAZE) {p.a, p.b-m+p.c, m, p.step+1}; q.a=p.a; q.b=p.b-m+p.c; q.c=m; q.step=p.step+1; } else { // q= (MAZE) {p.a, 0, p.c+p.b, p.step+1}; q.a=p.a; q.b=0; q.c=p.c+p.b; q.step=p.step+1; } if(visit[q.a][q.b][q.c]==0) { visit[q.a][q.b][q.c]=1; que.push(q); } } if(p.c!=0) { if(p.c>s-p.a)//也就是说p.c还有剩余 { //q= (MAZE) {s, p.b, p.c-s+p.a, p.step+1}; q.a=s; q.b=p.b; q.c=p.c-s+p.a; q.step=p.step+1; } else { // q= (MAZE) {p.a+p.c, p.b, 0. p.step+1}; q.a=p.a+p.c; q.b=p.b; q.c=0; q.step=p.step+1; } if(visit[q.a][q.b][q.c]==0) { visit[q.a][q.b][q.c]=1; que.push(q); } if(p.c>n-p.b)//也就是说p.c 还有剩余 { //q= (MAZE) {p.a, n, p.c+p.b-n, p.step+1}; q.a=p.a; q.b=n; q.c=p.c+p.b-n; q.step=p.step+1; } else { //q= (MAZE){p.a, p.b+p.c, 0, p.step+1}; q.a=p.a; q.b=p.b+p.c; q.c=0; q.step=p.step+1; } if(visit[q.a][q.b][q.c]==0) { visit[q.a][q.b][q.c]=1; que.push(q); } } } printf("NO\n"); }
时间: 2024-12-20 16:20:36