poj_1606_回溯

来源:互联网 发布:findpeaks算法 编辑:程序博客网 时间:2024/04/29 00:06

题目描述:

 

 

解题思路:

 

 

代码:

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

char print_str[6][20] = {{"pour A B"},{"pour B A"},{"fillB"},{"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;
}

原创粉丝点击