poj3414

靠的,写了一上午,终于AC了,靠的............poj的题确实要麻烦一些.

代码有点长,但思路一点也不麻烦。

1,找最短路时,用bfs。这个很简单。 2,关键,不太熟悉记录路径。最后借鉴了一下别人的算法,用一个结构体数组存储路径,再用dfs 的思想找到起点。

顺势输出, KO!  写完之后,回顾一下,就是考察你会不会回溯。要深刻理解回溯啊!太有用了

#include<iostream>
#include<queue>
#include<cstring>
#include<cstdio>
using namespace std;
int a,b,c;
int result;

struct node
{
 int x;
 int y;
 int step;
};

struct point
{
 int px;
 int py;
 int chao;     //存储从  [px,py]  到  [x,y]的操作
}pre[110][110];        //用来存储父节点,例如  p[x][y]的父节点是 p[x][y].px, p[x][y].py;

int visit[110][110];    


void dfs(int x,int y)
{
 if(x+y!=0)
 {
  //printf("%d    %d\n",x,y);
  dfs(pre[x][y].px,pre[x][y].py);
 }
 if(pre[x][y].chao==1)
 {
  printf("FILL(1)\n");
  return ;
 }
 if(pre[x][y].chao==2)
 {
  printf("FILL(2)\n");
  return ;
 }
 if(pre[x][y].chao==3)
 {
  printf("DROP(1)\n");
  return ;
 }
 if(pre[x][y].chao==4)
 {
  printf("DROP(2)\n");
  return ;
 }
 if(pre[x][y].chao==5)
 {
  printf("POUR(2,1)\n");
  return ;
 }
 if(pre[x][y].chao==6)
 {
  printf("POUR(1,2)\n");
  return ;
 }

void bfs()
{
 memset(visit,0,sizeof(visit));
 memset(pre,0,sizeof(pre));
 
 queue<node> qu;
 node p,temp;
 p.x=0;
 p.y=0;
 p.step=0;
 visit[p.x][p.y]=1;         //这个点已经访问过
 qu.push(p);
 while(!qu.empty())
 {
  p=qu.front();
  qu.pop();
  
  if(p.x==c||p.y==c)
  {
    printf("%d\n",p.step);
    dfs(p.x,p.y);
    result=1;
   
  }
  
  //temp.step=p.step+1;
  
  //   fill 1
  temp.x=a;
  temp.y=p.y;
  if(!visit[temp.x][temp.y])
  {
   pre[temp.x][temp.y].px=p.x;     //存储路径
   pre[temp.x][temp.y].py=p.y;
   pre[temp.x][temp.y].chao=1;
        
   visit[temp.x][temp.y]=1;
   temp.step=p.step+1;
   qu.push(temp);
  }
  //fill 2
  temp.x=p.x;
  temp.y=b;
  if(!visit[temp.x][temp.y])
  {
   pre[temp.x][temp.y].px=p.x;     //存储路径
   pre[temp.x][temp.y].py=p.y;
   pre[temp.x][temp.y].chao=2;
   
   visit[temp.x][temp.y]=1;
   temp.step=p.step+1;
   qu.push(temp);
  }
  //drop 1
  temp.x=0;
  temp.y=p.y;
  if(!visit[temp.x][temp.y])
  {
   pre[temp.x][temp.y].px=p.x;     //存储路径
   pre[temp.x][temp.y].py=p.y;
   pre[temp.x][temp.y].chao=3;
   
   visit[temp.x][temp.y]=1;
   temp.step=p.step+1;
   qu.push(temp);
  }
  //drop 2
  temp.x=p.x;
  temp.y=0;
  if(!visit[temp.x][temp.y])
  {
   pre[temp.x][temp.y].px=p.x;     //存储路径
   pre[temp.x][temp.y].py=p.y;
   pre[temp.x][temp.y].chao=4;
   
   visit[temp.x][temp.y]=1;
   temp.step=p.step+1;
   qu.push(temp);
  }
  //pour(2,1)
  if(p.x+p.y<=a)
  {
   temp.x=p.x+p.y;
   temp.y=0;
  if(!visit[temp.x][temp.y])
  {
   pre[temp.x][temp.y].px=p.x;     //存储路径
   pre[temp.x][temp.y].py=p.y;
   pre[temp.x][temp.y].chao=5;
   
   visit[temp.x][temp.y]=1;
   temp.step=p.step+1;
   qu.push(temp);
  }
     }
     else
     {
   temp.x=a;
   temp.y=p.x+p.y-a;
  if(!visit[temp.x][temp.y])
  {
   pre[temp.x][temp.y].px=p.x;     //存储路径
   pre[temp.x][temp.y].py=p.y;
   pre[temp.x][temp.y].chao=5;
   
   visit[temp.x][temp.y]=1;
   temp.step=p.step+1;
   qu.push(temp);
  }
     }
    
     //  drop(1,2)
     if(p.x+p.y<=b)
     {
   temp.x=0;
   temp.y=p.x+p.y;
  if(!visit[temp.x][temp.y])
  {
   pre[temp.x][temp.y].px=p.x;     //存储路径
   pre[temp.x][temp.y].py=p.y;
   pre[temp.x][temp.y].chao=6;
   
   visit[temp.x][temp.y]=1;
   temp.step=p.step+1;
   qu.push(temp);
  }
     }
     else
     {
   temp.x=p.x+p.y-b;
   temp.y=b;
  if(!visit[temp.x][temp.y])
  {
   pre[temp.x][temp.y].px=p.x;     //存储路径
   pre[temp.x][temp.y].py=p.y;
   pre[temp.x][temp.y].chao=6;
   
   visit[temp.x][temp.y]=1;
   temp.step=p.step+1;
   qu.push(temp);
  }
     }
    
 }
}


int main()
{
 int i,j,k;
 while(cin>>a>>b>>c)
 {
  result=0;
  bfs();
  if(result==0)
  printf("impossible\n");
 }
 return 0;
}

posted on 2012-03-24 13:32  hrbust_09zhangyabin  阅读(434)  评论(0编辑  收藏  举报