poj_1606_回溯

题目描述:

 

 

解题思路:

 

 

代码:

#include <stdio.h>
#include <stdlib.h>
#define N 1000

char print_str[6][20] = {{"pour A B"},{"pour B A"},{"fill B"},{"fill A"},{"empty B"},{"empty A"}};
int a, b, n, count, result[N], current[2], flag[N][N];

int find()
{
   int c[2],tmp, i, f;
   if(current[0]==0 && current[1]==0){
      return 1;
   }else{
      f = 0;
      flag[current[0]][current[1]] = 1;
      c[0] = current[0];
      c[1] = current[1];
      //pour A B
      if((current[0]<a && current[1]==b)||(current[0]==0)){
         if(current[0]!=0){
             tmp = a - current[0];
             current[0] = a;
             current[1] = b-tmp;
         }else{
            if(current[0]+current[1]<a){
               current[0] = current[1];
               current[1] = 0;
            }else{
               current[1] =  current[1] - a;
               current[0] = a;
            }
         }
         result[count] = 0;
         count ++;
         if(flag[current[0]][current[1]] == 0){
            f = find();
            if(f)
               return f;
            flag[current[0]][current[1]] = 0;
         }
         current[0] = c[0];
         current[1] = c[1];
         count --;
      }
      //pour B A
      if((current[0]==a && current[1]<b)||(current[1]==0)){
         if(current[1]!=0){
             if(current[0]+current[1]<=b){
                current[1] = current[0] + current[1];
                current[0] = 0;
             }else{
                 tmp = b - current[1];
                 current[1] = b;
                 current[0] = a - tmp;
             }
         }else{
            current[1] = current[0];
            current[0] = 0;
         }
         if(current[0]>=0){
             result[count] = 1;
             count ++;
             if(flag[current[0]][current[1]] == 0){
                f = find();
                if(f)
                   return f;
                 flag[current[0]][current[1]] = 0;
             }
             count --;
           
         }
         current[0] = c[0];
         current[1] = c[1];
      }
      //fill B
      if(f==0 && (current[1] == b)){
         result[count] = 2;
         for(i=0;i<b;i++){
            current[1]=i;
            count ++;
            if(flag[current[0]][current[1]] == 0){
               f = find();
               if(f)
                  return f;
               flag[current[0]][current[1]] = 0;
            }
           
            current[0]=c[0];
            count--;
         }
      }
      //fill A
      if(current[0] == a){
         result[count] = 3;
        
         for(i=0;i<a;i++){
            current[0]=i;
            count ++;
            if(flag[current[0]][current[1]] == 0){
               f = find();
               if(f)
                  return f;
               flag[current[0]][current[1]] = 0;
            }
           
            current[1]=c[1];
            count--;
         }
      }
      //empty B
      if(current[1] == 0){
         result[count] = 4;
         for(i=1;i<=b;i++){
            current[1] = i;
            count++;
            if(flag[current[0]][current[1]] == 0){
               f = find();
               if(f)
                  return f;
               flag[current[0]][current[1]] = 0;
            }
           
            current[0] = c[0];
            count --;
         }
      }
      //empty A
      if(current[0] == 0){
         result[count] = 5;
         for(i=1;i<=a ;i++){
            current[0] = i;
            count ++;
            if(flag[current[0]][current[1]] == 0){
               f = find();
               if(f)
                  return f;
            flag[current[0]][current[1]] = 0;
            }
           
            current[1] = c[1];
            count --;
         }
      }
      return f;
   
}


main()
   
   int f, i;
  
   while(scanf("%d %d %d",&a, &b, &n)!=EOF){
       memset(flag, 0, sizeof(flag));
       current[0] = 0;
       current[1] = n;
       f = find();
       if(!f){
           current[0] = a;
           current[1] = n;
           f = find();
       
       for(i=count-1;i>=0;i--)
          printf("%s\n",print_str[result[i]]);
       printf("success\n");
       count = 0;
   }
   //system("pause");
   return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值