COJ1150(食用油)

题目大意:这题跟HDOJ"非常可乐"那题很像,用状态空间搜索即可。

View Code
 1 #include <stdio.h>

 2 #include <string.h>

 3 #include <queue>

 4 #define N 101

 5 #define MIN(a,b) ((a)<(b)?(a):(b))

 6 using namespace std;

 7 typedef struct node

 8 {

 9   int v[2],t;

10 }node;

11 node cur,next;

12 queue<node> Q;

13 int a[2],c;

14 char vis[N][N];

15 node st_tran(node tmp,int i)

16 {

17   int d;

18   switch(i)

19   {

20     case 0: tmp.v[0]=a[0];  break;

21     case 1: tmp.v[1]=a[1];  break;

22     case 2: tmp.v[0]=0; break;

23     case 3: tmp.v[1]=0; break;

24     case 4: d=MIN(tmp.v[0],a[1]-tmp.v[1]),tmp.v[0]-=d,tmp.v[1]+=d;  break;

25     case 5: d=MIN(tmp.v[1],a[0]-tmp.v[0]),tmp.v[1]-=d,tmp.v[0]+=d;  break;

26   }

27   tmp.t++;

28   return tmp;

29 }

30 void bfs()

31 {

32   bool success=false;

33   int ans;

34   memset(vis,0,sizeof(vis));

35   while(!Q.empty()) Q.pop();

36   cur.v[0]=cur.v[1]=0;

37   cur.t=0;

38   vis[0][0]=1;

39   Q.push(cur);

40   while(!Q.empty() && !success)

41   {

42     cur=Q.front(),Q.pop();

43     if(cur.v[0]==c || cur.v[1]==c)  success=true,ans=cur.t;

44     for(int i=0;!success && i<6;i++)

45     {

46       next=st_tran(cur,i);

47       if(vis[next.v[0]][next.v[1]]) continue;

48       if(next.v[0]==c || next.v[1]==c)  success=true,ans=next.t;

49       else  vis[next.v[0]][next.v[1]]=1,Q.push(next);

50     }

51   }

52   if(success) printf("%d\n",ans);

53   else  puts("-1");

54 }

55 int main()

56 {

57   while(~scanf("%d%d%d",&a[0],&a[1],&c))

58   {

59     bfs();

60   }

61   return 0;

62 }

 

你可能感兴趣的:(OJ)