题目链接:点击打开链接
题目大意:略。
解题思路:记忆化搜索,对每个状态都有六种情况:
- 把A倒满
- 把B倒满
- 把A倒光
- 把B倒光
- 把A倒进B
- 把B倒进A
六个情况直接搜索就可以了...当然dfs是会超时的,需要用记忆化搜索。
AC 代码
#include<bits/stdc++.h> #include<cmath> #define mem(a,b) memset(a,b,sizeof a); #define INF 0x3f3f3f3f using namespace std; typedef long long ll; typedef pair<int,int> pii; queue<pii> q; int a,b,c; int vis[110][110], dis[110][110]; void init() { while(!q.empty()) q.pop(); mem(vis,0); mem(dis,0); } int bfs() { dis[0][0]=0; vis[0][0]=1; q.push(make_pair(0,0)); int x,y,A,B; while(!q.empty()) { x=q.front().first, y=q.front().second; q.pop(); for(int i=1;i<=6;i++) { if(i==1) A=a, B=y; else if(i==2) A=x, B=b; else if(i==3) A=0, B=y; else if(i==4) A=x, B=0; else if(i==5) A=x+y>=b?x+y-b:0, B=x+y>=b?b:x+y; else if(i==6) B=x+y>=a?x+y-a:0, A=x+y>=a?a:x+y; if(!vis[A][B]) { vis[A][B]=1; dis[A][B]=1+dis[x][y]; if(A==c || B==c) return dis[A][B]; q.push(make_pair(A,B)); } } } return 0; } int main() { while(~scanf("%d%d%d",&a,&b,&c)) { init(); int rs=bfs(); if(rs) printf("%d\n",rs); else puts("impossible"); } return 0; }