poj3414

4 篇文章 0 订阅

尽管我的代码写的如此冗长,难入法眼。我承认自己的弱。但至少此刻我很开心。



import java.io.BufferedInputStream;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.Vector;

public class Main {
	
	static int x,y,z;
	static int[] say;
	static int[][] vis;
	

	static String [] words= {
			"",
			"DROP(1)",
			"FILL(1)",
			"POUR(1,2)",
			"DROP(2)",
			"FILL(2)",
			"POUR(2,1)"
	};
	
	
	static class Node{
		int a1;
		int a2;
		int step;
		int[] way=new int[1003];
	}
	static int bfs() {
		Queue<Node> q = new LinkedList<Node>();
		Node node=new Node(); node.a1=0;node.a2=0;node.step=0;
		vis[0][0]=1;
		q.add(node);
		while(!q.isEmpty()) {
			
			Node top = q.poll();
			if(top.a1==z || top.a2==z) {
				System.out.println(top.step);
				for(int i=1;i<=top.step;i++) {
					System.out.println(words[top.way[i]]);
				}
				return top.step;
				
			}
			//System.out.print(top.a1); System.out.print(" "); System.out.println(top.a2);System.out.println();
			for(int i=0;i<2;i++) {
				if(i==0) {
					for(int j=0;j<3;j++) {
						if(j==0) {
							if(top.a1!=0) {
								Node temp =new Node();
								temp.a1 = 0;
								temp.a2=top.a2;
								temp.step = top.step+1;
								System.arraycopy(top.way, 1, temp.way, 1, 1000);
								temp.way[temp.step]=1;
								if(vis[temp.a1][temp.a2]==0)
								{
									vis[temp.a1][temp.a2]=1;
									q.add(temp);
								}
							}
						}
						if(j==1) {
								if(top.a1!=x) {
									Node temp = new Node();
									temp.a1 = x;
									temp.a2 = top.a2;
									temp.step = top.step+1;
									System.arraycopy(top.way, 1, temp.way, 1, 1000);
									
									temp.way[temp.step]=2;
									if(vis[temp.a1][temp.a2]==0)
									{
										vis[temp.a1][temp.a2]=1;
										q.add(temp);
									}
								}
						}
						if(j==2) {
								if(top.a1!=0 && top.a2!=y) {
									Node temp = new Node();
									temp.a1 = Math.max(0,top.a1+top.a2-y);
									temp.a2 = Math.min(y,top.a2+top.a1);
									temp.step = top.step+1;
									System.arraycopy(top.way, 1, temp.way, 1, 1000);
									
									temp.way[temp.step]=3;
									if(vis[temp.a1][temp.a2]==0)
									{
										vis[temp.a1][temp.a2]=1;
										q.add(temp);
									}
								}
						}
					}
				}else if(i==1) {
					for(int j=0;j<3;j++) {
						if(j==0) {
								if(top.a2!=0) {
									Node temp =new Node();
									temp.a1 = top.a1;
									temp.a2=0;
									temp.step = top.step+1;
									System.arraycopy(top.way, 1, temp.way, 1, 1000);
									
									temp.way[temp.step]=4;
									if(vis[temp.a1][temp.a2]==0)
									{
										vis[temp.a1][temp.a2]=1;
										q.add(temp);
									}
								}
						}
						if(j==1) {
								if(top.a2!=y) {
									Node temp = new Node();
									temp.a1 = top.a1;
									temp.a2 = y;
									temp.step = top.step+1;
									System.arraycopy(top.way, 1, temp.way, 1, 1000);
									
									temp.way[temp.step]=5;
									if(vis[temp.a1][temp.a2]==0)
									{
										vis[temp.a1][temp.a2]=1;
										q.add(temp);
									}
								}
						}
						if(j==2) {
								if(top.a2!=0 && top.a1!=x) {
									Node temp = new Node();
									temp.a1 = Math.min(x,top.a2+top.a1);
									temp.a2 = Math.max(0, top.a1+top.a2-x);
									temp.step = top.step+1;
									System.arraycopy(top.way, 1, temp.way, 1, 1000);
									
									temp.way[temp.step]=6;
									if(vis[temp.a1][temp.a2]==0)
									{
										vis[temp.a1][temp.a2]=1;
										q.add(temp);
									}
								}
						}
					}				
				}
			}
			
			
		}
		return -1;
	}
	public static void main(String[] args) {
		Scanner sc = new Scanner(new BufferedInputStream(System.in));
		x=sc.nextInt();
		y=sc.nextInt();
		z=sc.nextInt();
		vis = new int[1000][1000];

		int res = bfs();
		if(res==-1) {
			System.out.println("impossible");
		}
/*		for(int i=1;i<=res;i++) {
			//System.out.println(words[say[i]]);
			System.out.println(say[i]);
		}*/
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值