POJ 3414 Pots

此题是倒水问题,用两个已知容量没有刻度的杯子量出一定量的水,可以则输出最短路径
bfs题,只不过方向要自己一个个枚举
#include
   
   
    
    
#include
    
    
     
     
const int MAX=102;
int n,m,k,flag,sx,sy;
int path[MAX][MAX][2];
int mark[MAX][MAX];
int vis[MAX][MAX];
int record[MAX][2];
int len[MAX][MAX];
int tol,min;
struct node
{
	int x,y;
	node(){
	}
	node(int x,int y){
		this->x=x;
		this->y=y;
	}
}q[MAX*MAX];/*结构体,方便读入*/
void bfs(int x,int y)
{
	int begin=0,end=0;
	q[end++]=node(x,y);/*将x,y放入队列*/ 
	vis[x][y] = 1;
	len[x][y] = 0;
	while(begin
     
     
      
       d){
			xx=now.x-d;
			yy=m;
			}
		    else{
			  xx = 0;
              yy = now.y+now.x;
			}
		  }
		   else if(i==5){
			    int d;
				d = n - now.x;
                if(now.y > d){
			      xx=n;
			      yy=now.y-d;
                }
                else{
                     xx = now.x+now.y;
                     yy = 0;
                   }
		}
     if(vis[xx][yy])
       continue;
      vis[xx][yy] = 1;
      mark[xx][yy]= i;/*记录方向*/ 
      len[xx][yy] = len[now.x][now.y] + 1;
      /*记录从哪里拓展而来*/ 
      path[xx][yy][0] = now.x;
      path[xx][yy][1] = now.y;
      q[end++] = node(xx,yy);
		if(xx==k||yy==k){
			/*记录最短路径的值*/ 
			if(len[xx][yy] < min){
				min = len[xx][yy];
				sx = xx;
			    sy = yy;
			} 
			flag=1;
			break;
		}

	}
	}
	/*找出最短路径*/ 
	int lx = sx,ly = sy;
	   while(lx !=-1){
		record[tol][0] = lx;
        record[tol][1] = ly;
        int a = path[lx][ly][0];
        int b = path[lx][ly][1];
        lx = a;
        ly = b;
        tol++;
	}
}
int main()
{
     while(scanf("%d%d%d",&n,&m,&k)!=EOF){
         flag = 0;
		 tol = 0;
		 min = 1000;
	     sx=-1;sy=-1;
         memset(path,-1,sizeof(path));
	     memset(mark,-1,sizeof(mark));
	     memset(vis,0,sizeof(vis));
	     bfs(0,0);
         if(flag){
	           printf("%d\n",min);
	           for(int i = tol -1; i >= 0;i--){
                     int k1 = record[i][0];
                     int k2 = record[i][1];
			         switch(mark[k1][k2]){
				           case 0:printf("FILL(1)\n");break;
				           case 1:printf("FILL(2)\n");break;
				           case 2:printf("DROP(1)\n");break;
				           case 3:printf("DROP(2)\n");break;
				           case 4:printf("POUR(1,2)\n");break;
			               case 5:printf("POUR(2,1)\n");break;
			       }
	        }

         }
	          else printf("impossible\n");
    }
	return 0;
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值