题目1457:非常可乐(广度优先遍历BFS)
题目链接:http://ac.jobdu.com/problem.php?pid=1457
详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus
参考代码:
// // 1457 非常可乐.cpp // Jobdu // // Created by PengFei_Zheng on 22/04/2017. // Copyright © 2017 PengFei_Zheng. All rights reserved. // #include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> #include <cmath> #include <queue> #define MAX_SIZE 101 using namespace std; int s, n, m; struct N{ int a; int b; int c; int t; }; queue<N> myQueue; bool visit[MAX_SIZE][MAX_SIZE][MAX_SIZE]; void x2y(int &x,int size_x, int &y,int size_y){ if(size_y - y >= x){ y+=x; x = 0; }else{ x -=(size_y-y); y = size_y; } } int BFS(int s, int n, int m){ while(!myQueue.empty()){ N nowP = myQueue.front(); myQueue.pop(); int a, b, c; a = nowP.a; b = nowP.b; c = nowP.c; x2y(a,s,b,n);// a--->b if(visit[a][b][c]==false){ visit[a][b][c]=true; N tmp; tmp.a = a; tmp.b = b; tmp.c = c; tmp.t = nowP.t+1; if((a==s/2 && b==s/2) || (a==s/2 &&c==s/2) || (b==s/2 && c==s/2) ) return tmp.t; myQueue.push(tmp); } a = nowP.a; b = nowP.b; c = nowP.c; x2y(a,s,c,m);// a--->c if(visit[a][b][c]==false){ visit[a][b][c]=true; N tmp; tmp.a = a; tmp.b = b; tmp.c = c; tmp.t = nowP.t+1; if((a==s/2 && b==s/2) || (a==s/2 &&c==s/2) || (b==s/2 && c==s/2) ) return tmp.t; myQueue.push(tmp); } a = nowP.a; b = nowP.b; c = nowP.c; x2y(b,n,a,s);// b--->a if(visit[a][b][c]==false){ visit[a][b][c]=true; N tmp; tmp.a = a; tmp.b = b; tmp.c = c; tmp.t = nowP.t+1; if((a==s/2 && b==s/2) || (a==s/2 &&c==s/2) || (b==s/2 && c==s/2) ) return tmp.t; myQueue.push(tmp); } a = nowP.a; b = nowP.b; c = nowP.c; x2y(b,n,c,m);// b--->c if(visit[a][b][c]==false){ visit[a][b][c]=true; N tmp; tmp.a = a; tmp.b = b; tmp.c = c; tmp.t = nowP.t+1; if((a==s/2 && b==s/2) || (a==s/2 &&c==s/2) || (b==s/2 && c==s/2) ) return tmp.t; myQueue.push(tmp); } a = nowP.a; b = nowP.b; c = nowP.c; x2y(c,m,a,s);// c--->a if(visit[a][b][c]==false){ visit[a][b][c]=true; N tmp; tmp.a = a; tmp.b = b; tmp.c = c; tmp.t = nowP.t+1; if((a==s/2 && b==s/2) || (a==s/2 &&c==s/2) || (b==s/2 && c==s/2) ) return tmp.t; myQueue.push(tmp); } a = nowP.a; b = nowP.b; c = nowP.c; x2y(c,m,b,n);// c--->b if(visit[a][b][c]==false){ visit[a][b][c]=true; N tmp; tmp.a = a; tmp.b = b; tmp.c = c; tmp.t = nowP.t+1; if((a==s/2 && b==s/2) || (a==s/2 &&c==s/2) || (b==s/2 && c==s/2) ) return tmp.t; myQueue.push(tmp); } } return -1; } int main(){ while(scanf("%d%d%d",&s,&n,&m)!=EOF){ if(s==0) break; if(s%2==1){ printf("NO\n"); continue; } for(int i = 0 ; i <= s ; i++){ for(int j = 0 ; j <= n ; j++){ for(int k = 0 ; k <= m ; k++){ visit[i][j][k]=false; } } } while(!myQueue.empty()) myQueue.pop(); N tmp; tmp.a = s; tmp.b = tmp.c = tmp.t = 0; myQueue.push(tmp); visit[s][0][0]=true; int ans = BFS(s,n,m); ans == -1 ? printf("NO\n") : printf("%d\n",ans); } } /************************************************************** Problem: 1457 User: zpfbuaa Language: C++ Result: Accepted Time:10 ms Memory:2528 kb ****************************************************************/
作者: 伊甸一点
出处: http://www.cnblogs.com/zpfbuaa/
本文版权归作者伊甸一点所有,欢迎转载和商用(须保留此段声明),且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
原文链接 如有问题, 可邮件(zpflyfe@163.com)咨询.