六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 29|回复: 0

poj3414——Pots

[复制链接]

升级  93.8%

309

主题

309

主题

309

主题

进士

Rank: 4

积分
969
 楼主| 发表于 2013-1-26 13:37:34 | 显示全部楼层 |阅读模式
绝对的BFS好题!在实验室师兄的启发下,1A!
代码有点长...
#include<stdio.h>#include<string.h>struct node{int u1,u2,step;}tt[10000];bool vis[105][105];int a,b,c,front=0,rear=0;int pre[10000];void pri(int front){int i,top=1,s,x,y;struct node kk[1000];kk[top]=tt[front];s=pre[front];while(s!=-1){kk[++top]=tt[s];s=pre[s];}printf("%d\n",top-1);for(i=top-1;i>0;i--){int k=kk[i].step ;switch(k){case 1:printf("FILL(1)\n");break;case 2:printf("DROP(1)\n");break;case 3:printf("POUR(1,2)\n");break;case 4:printf("FILL(2)\n");break;case 5:printf("DROP(2)\n");break;default :printf("POUR(2,1)\n");break;}}}void solve(){int i,tempx,tempy,x,y;bool flag=true;memset(pre,-1,sizeof(pre));scanf("%d%d%d",&a,&b,&c);rear++;tt[rear].u1=0;tt[rear].u2=0;tt[rear].step =-1;memset(vis,true,sizeof(vis));vis[0][0]=false;while(rear!=front){front++;x=tt[front].u1;y=tt[front].u2;if(x+y==c||x==c||y==c){pri(front);flag=false;break;}for(i=1;i<=6;i++){switch(i){case 1:if(x<a){tempx=a;tempy=y;if(vis[tempx][tempy]){vis[tempx][tempy]=false;tt[++rear].u1=tempx;tt[rear].u2=tempy;tt[rear].step =i;pre[rear]=front;}}break;case 2:if(x>0){tempx=0;tempy=y;if(vis[tempx][tempy]){vis[tempx][tempy]=false;tt[++rear].u1=tempx;tt[rear].u2=tempy;tt[rear].step =i;pre[rear]=front;}}break;case 3:if(x>0&&y<b){if(b-y>=x){tempx=0;tempy=y+x;if(vis[tempx][tempy]){vis[tempx][tempy]=false;tt[++rear].u1=tempx;tt[rear].u2=tempy;tt[rear].step =i;pre[rear]=front;}}else {tempx=x-(b-y);tempy=b;if(vis[tempx][tempy]){vis[tempx][tempy]=false;tt[++rear].u1=tempx;tt[rear].u2=tempy;tt[rear].step =i;pre[rear]=front;}}}break;case 4:if(y<b){tempx=x;tempy=b;if(vis[tempx][tempy]){vis[tempx][tempy]=false;tt[++rear].u1=tempx;tt[rear].u2=tempy;tt[rear].step =i;pre[rear]=front;}}break;case 5:if(y>0){tempx=x;tempy=0;if(vis[tempx][tempy]){vis[tempx][tempy]=false;tt[++rear].u1=tempx;tt[rear].u2=tempy;tt[rear].step =i;pre[rear]=front;}}break;default :if(y>0&&x<a){if(a-x>=y){tempx=x+y;tempy=0;if(vis[tempx][tempy]){vis[tempx][tempy]=false;tt[++rear].u1=tempx;tt[rear].u2=tempy;tt[rear].step =6;pre[rear]=front;}}else {tempx=a;tempy=y-(a-x);if(vis[tempx][tempy]){vis[tempx][tempy]=false;tt[++rear].u1=tempx;tt[rear].u2=tempy;tt[rear].step =6;pre[rear]=front;}}}break;}}}if(flag)printf("impossible\n");}int main(){solve();return 0;}
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表