HDU 1495 非常可乐(最笨办法版)
2015-08-11 17:22
405 查看
原题链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1495题目大意:
略思路:
3个杯子。有6种情况的道法。每种遍历就可以了主要是比较复杂的原因是加法较多。
结构体只是为了方便一点。
退出时的判定比较坑。要两个相等的同时另一个等于0才满足条件
代码如下:
#include <iostream> #include <cstdio> #include <cstring> #include <queue> using namespace std; int S,N,M; int NUMBER; bool Can; int vis[101][101][101]; struct Tri { int s; int n; int m; int number; }; bool IsOver( int s,int n,int m ) { if( (s == m && s != 0 && n == 0 )|| ( s == n && n != 0 && m==0 )|| ( m == n && m !=0 && s == 0 ) ) return true; return false; } bool IsLeagal( int s,int n,int m ) { if( s < 0 || s > S || n < 0 || n > N || m < 0 || m > M ) return false; return true; } void bfs() { queue<Tri> Ways; memset( vis,0,sizeof( vis)); vis[S][0][0] = 1; Tri Now,Next1,Next2,Next3,Next4,Next5,Next6; Now.s = S; Now.n = 0; Now.m = 0; Now.number = 0; Ways.push ( Now ); while( !Ways.empty ()) { Now.s = Ways.front ().s ; Now.n = Ways.front ().n ; Now.m = Ways.front ().m ; Now.number = Ways.front ().number ; Ways.pop (); if( Can ) return; /* 从第一个杯子到给第二个杯子 */ if( Now.s > ( N - Now.n) ) { Next1.s = Now.s - ( N - Now.n); Next1.n = N; Next1.m = Now.m; Next1.number = Now.number + 1;} else { Next1.s = 0; Next1.n = Now.n + Now.s ; Next1.m = Now.m; Next1.number = Now.number + 1;} if( IsLeagal( Next1.s ,Next1.n ,Next1.m ) && !vis[Next1.s ][Next1.n ][Next1.m ]) { vis[Next1.s ][Next1.n ][Next1.m ] = 1; if( IsOver( Next1.s ,Next1.n ,Next1.m )) { Can = true; NUMBER = Next1.number ; return; } Ways.push ( Next1 ); } /* 从第一个杯子到给第三个杯子 */ if( Now.s > ( M - Now.m ) ) { Next2.s = Now.s - ( M - Now.m ); Next2.n = Now.n; Next2.m = M; Next2.number = Now.number + 1;} else { Next2.s = 0; Next2.n = Now.n; Next2.m = Now.s + Now.m; Next2.number = Now.number + 1;} if( IsLeagal( Next2.s ,Next2.n ,Next2.m ) && !vis[Next2.s ][Next2.n ][Next2.m ]) { vis[Next2.s ][Next2.n ][Next2.m ] = 1; if( IsOver( Next2.s ,Next2.n,Next2.m )) { Can = true; NUMBER = Next2.number ; return; } Ways.push ( Next2 ); } /* 从第二个杯子到给第一个杯子 */ if( Now.n > ( S - Now.s ) ) { Next3.s = S; Next3.n = Now.n - ( S - Now.s ); Next3.m = Now.m; Next3.number = Now.number + 1;} else { Next3.s = Now.s + Now.n ; Next3.n = 0; Next3.m = Now.m; Next3.number = Now.number + 1;} if( IsLeagal( Next3.s ,Next3.n ,Next3.m ) && !vis[Next3.s ][Next3.n ][Next3.m ]) { vis[Next3.s ][Next3.n ][Next3.m ] = 1; if( IsOver( Next3.s ,Next3.n ,Next3.m )) { Can = true; NUMBER = Next3.number ; return; } Ways.push ( Next3 ); } /* 从第二个杯子到给第三个杯子 */ if( Now.n > ( M - Now.m )) { Next4.s = Now.s ; Next4.n = Now.n - ( M - Now.m ); Next4.m = M; Next4.number = Now.number + 1;} else { Next4.s = Now.s ; Next4.n = 0; Next4.m = Now.n + Now.m ; Next4.number = Now.number + 1;} if( IsLeagal( Next4.s ,Next4.n ,Next4.m ) && !vis[Next4.s ][Next4.n ][Next4.m ]) { vis[Next4.s ][Next4.n ][Next4.m ] = 1; if( IsOver( Next4.s ,Next4.n ,Next4.m )) { Can = true; NUMBER = Next4.number ; return; } Ways.push ( Next4 ); } /* 从第三个杯子到给第一个杯子 */ if( Now.m - ( S - Now.s ) ) { Next5.s = S; Next5.n = Now.n ; Next5.m = Now.m - ( S - Now.s ); Next5.number = Now.number + 1;} else { Next5.s = Now.s + Now.m ; Next5.n = Now.n ; Next5.m = 0; Next5.number = Now.number + 1;} if( IsLeagal( Next5.s ,Next5.n ,Next5.m ) && !vis[Next5.s ][Next5.n ][Next5.m ]) { vis[Next5.s ][Next5.n ][Next5.m ] = 1; if( IsOver( Next5.s ,Next5.n ,Next5.m )) { Can = true; NUMBER = Next5.number ; return; } Ways.push ( Next5 ); } /* 从第三个杯子到给第二个杯子 */ if( Now.m > ( N - Now.n )) { Next6.s = Now.s; Next6.n = N; Next6.m = Now.m - ( N - Now.n ); Next6.number = Now.number + 1;} else { Next6.s = Now.s; Next6.n = Now.m + Now.n ; Next6.m = 0; Next6.number = Now.number + 1;} if( IsLeagal( Next6.s ,Next6.n ,Next6.m ) && !vis[Next6.s ][Next6.n ][Next6.m ]) { vis[Next6.s ][Next6.n ][Next6.m ] = 1; if( IsOver( Next6.s ,Next6.n ,Next6.m )) { Can = true; NUMBER = Next6.number ; return; } Ways.push ( Next6 ); } } } int main() { while( cin >> S >> N >> M ) { if( S == 0 && N == 0 && M == 0 ) break; if( N > M ) { int tmp; tmp = N; N =M; M = tmp; } if( S % 2 != 0 ) { cout<<"NO"<<endl; continue; } Can = false; bfs(); if( Can ) cout<< NUMBER <<endl; else cout<<"NO"<<endl; } return 0; }
相关文章推荐
- 搜狗百度360市值齐跌:搜索引擎们陷入集体焦虑?
- 本人即将筹备败家日志,敬请期待!
- IE:使用搜索助手
- 文件遍历排序函数
- Lua 学习笔记之C API 遍历 Table实现代码
- C#中遍历Hashtable的4种方法
- Erlang中遍历取出某个位置的最大值代码
- C++实现图的邻接矩阵存储和广度、深度优先遍历实例分析
- C++实现图的邻接表存储和广度优先遍历实例分析
- C++深度优先搜索的实现方法
- C++非递归队列实现二叉树的广度优先遍历
- php遍历目录方法小结
- 基于文本的搜索
- php实现搜索一维数组元素并删除二维数组对应元素的方法
- 一个目录遍历函数
- 使用Sphinx对索引进行搜索
- php遍历删除整个目录及文件的方法
- PHP遍历文件夹与文件类及处理类用法实例
- PHP遍历XML文档所有节点的方法
- php中使用key,value,current,next和prev函数遍历数组的方法