您的位置:首页 > 其它

HDU 1495 非常可乐(bfs)|POJ 3414 Pots(bfs+打印路径)

2013-08-02 15:48 826 查看
 
题目链接~~>

          这个题很有意义,很久以前就注意她了,不知道怎么搜!开始我用 dfs 写,写完后样例倒是能过,但是自己测试了几组数据就卡了,调试了老半天还是不行,接下来想怎么剪枝,郁闷了很久,决定上网搜一下,一搜原来用广搜

,回来又开始用广搜写,简单调试了一下 1A。以后做题一定要先想好要用什么方法,这种方法可行不,如果超时还不如不写,以后做题要慎重啊!

代码:

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std ;
int a,b,c,m;
int vis[100][100];//标记!!
struct zhang
{
int x,y,z,bu;
};
void bfs(int x)//倒水只有六种情况
{
queue<zhang>q;
zhang current,next;
memset(vis,0,sizeof(vis));
current.x=x;
current.y=0;
current.z=0;
current.bu=0;
q.push(current);
while(!q.empty())
{
current=q.front();
q.pop();
if(vis[current.y][current.z])
continue;
if(current.x>0&¤t.y<b)
{
if(current.x+current.y<=b)
{
next.x=0;next.y=current.x+current.y;
next.z=current.z;next.bu=current.bu+1;
if(next.x==next.y&&next.x*2==a)
{
m=next.bu;
return ;
}
else
q.push(next);
}
else{
next.x=current.x+current.y-b;
next.y=b;next.z=current.z;
next.bu=current.bu+1;
if(next.x==next.y&&next.x*2==a)
{
m=next.bu;
return ;
}
else
q.push(next);
}
}
if(current.x>0&¤t.z<c)
{
if(current.x+current.z<=c)
{
next.x=0;next.y=current.y;
next.z=current.x+current.z;
next.bu=current.bu+1;
if(next.x==next.y&&next.x*2==a)
{
m=next.bu;
return ;
}
else
q.push(next);
}
else
{
next.x=current.x+current.z-c;
next.y=current.y;next.z=c;
next.bu=current.bu+1;
if(next.x==next.y&&next.x*2==a)
{
m=next.bu;
return ;
}
else
q.push(next);
}
}
if(current.y>0)
{
next.x=current.x+current.y;
next.y=0;next.z=current.z;
next.bu=current.bu+1;
if(next.x==next.y&&next.x*2==a)
{
m=next.bu;
return ;
}
else
q.push(next);
}
if(current.y>0&¤t.z<c)
{
if(current.y+current.z<=c)
{
next.x=current.x;next.y=0;
next.z=current.y+current.z;
next.bu=current.bu+1;
if(next.x==next.y&&next.x*2==a)
{
m=next.bu;
return ;
}
else
q.push(next);
}
else
{
next.x=current.x;next.y=current.y+current.z-c;
next.z=c;next.bu=current.bu+1;
if(next.x==next.y&&next.x*2==a)
{
m=next.bu;
return ;
}
else
q.push(next);
}
}
if(current.z>0)
{
next.x=current.x+current.z;
next.y=current.y;next.z=0;
next.bu=current.bu+1;
if(next.x==next.y&&next.x*2==a)
{
m=next.bu;
return ;
}
else
q.push(next);
}
if(current.z>0&¤t.y<b)
{
if(current.z+current.y<=b)
{
next.x=current.x;next.y=current.z+current.y;
next.z=0;next.bu=current.bu+1;
if(next.x==next.y&&next.x*2==a)
{
m=next.bu;
return ;
}
else
q.push(next);
}
else {
next.x=current.x;
next.y=b;next.z=current.z+current.y-b;
next.bu=current.bu+1;
if(next.x==next.y&&next.x*2==a)
{
m=next.bu;
return ;
}
else
q.push(next);
}
}
vis[current.y][current.z]=1;
}
}
int main()
{
while(scanf("%d%d%d",&a,&b,&c)!=EOF)
{
if(a==0&&b==0&&c==0)
break;
if(b==c)
{
printf("1\n");
continue;
}
if(a%2)
{
printf("NO\n");
continue;
}
m=-1;
int t;
if(b<c)
{
t=b;b=c;c=t;
}
bfs(a);
if(m!=-1)
printf("%d\n",m);
else
printf("NO\n");
}
return 0;
}

题目链接~~>

                    POJ 的 3414题 就多了一个打印路径。

代码:

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std ;
const int INF=100000 ;
int a,b,c ;
bool vis[105][105] ;
struct zhang
{
int x,y,z,step,pre ;
}q[INF] ;
void search(int x)
{
if(!x||x==1)
printf("FILL(%d)\n",x+1) ;
else if(x==2||x==3)
printf("DROP(%d)\n",x-1) ;
else if(x==4)
printf("POUR(1,2)\n") ;
else if(x==5)
printf("POUR(2,1)\n") ;

}
void print(int k)
{
if(k!=-1)
{
print(q[k].pre) ;
search(q[k].z) ;
}
return  ;
}
int bfs(int x,int y)
{
int st=-1,head=0 ;
zhang curt,next ;
memset(vis,false,sizeof(vis)) ;
curt.x=x ;
curt.y=y ;
curt.z=-1 ;
curt.pre=-1 ;
curt.step=0 ;
vis[x][y]=true ;
q[++st]=curt ;
while(head<=st)
{
curt=q[head++] ;
if(curt.x==c||curt.y==c)
{
printf("%d\n",curt.step) ;
print(head-1) ;
return true ;
}
next.step=curt.step+1 ;
next.pre=head-1 ;
if(curt.x<a) //倒满A
{
next.x=a ;
next.y=curt.y ;
next.z=0 ;
if(!vis[next.x][next.y])
{
vis[next.x][next.y]=true ;
q[++st]=next ;
}
}
if(curt.y<b)//倒满B
{
next.x=curt.x ;
next.y=b ;
next.z=1 ;
if(!vis[next.x][next.y])
{
vis[next.x][next.y]=true ;
q[++st]=next ;
}
}
if(curt.x) // 倒掉A
{
next.x=0 ;
next.y=curt.y ;
next.z=2 ;
if(!vis[next.x][next.y])
{
vis[next.x][next.y]=true ;
q[++st]=next ;
}
}
if(curt.y)// 倒掉B
{
next.x=curt.x ;
next.y=0 ;
next.z=3 ;
if(!vis[next.x][next.y])
{
vis[next.x][next.y]=true ;
q[++st]=next ;
}
}
if(curt.x>0&&curt.y<b)// 从A 中向B 中倒水
{
next.z=4 ;
if(curt.x<=b-curt.y)
{
next.x=0 ;
next.y=curt.y+curt.x ;
if(!vis[next.x][next.y])
{
vis[next.x][next.y]=true ;
q[++st]=next ;
}
}
else
{
next.x=curt.x+curt.y-b ;
next.y=b ;
if(!vis[next.x][next.y])
{
vis[next.x][next.y]=true ;
q[++st]=next ;
}
}
}
if(curt.x<a&&curt.y>0)// 从B 中向A 中倒水
{
next.z=5 ;
if(curt.y<=a-curt.x)
{
next.x=curt.x+curt.y ;
next.y=0 ;
if(!vis[next.x][next.y])
{
vis[next.x][next.y]=true ;
q[++st]=next ;
}
}
else
{
next.x=a ;
next.y=curt.y+curt.x-a ;
if(!vis[next.x][next.y])
{
vis[next.x][next.y]=true ;
q[++st]=next ;
}
}
}
}
return false ;
}
int main()
{
while(scanf("%d%d%d",&a,&b,&c)!=EOF)
{
if(!bfs(0,0))
printf("impossible\n") ;
}
}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: