第八届 哈理工程序设计竞赛同步赛(高年级)G.小乐乐打游戏(Java版)

前几天就在写这题,听了队友的思路,他ac了,然后我照着他的思路写了一发Java,刚开始忘了多组数据输入,一直wa,然后改了之后更崩溃了,因为一直报数组溢出错误,一直没发现错误,我还以为是数据有问题。。。结果今天心血来潮去看了下别人的代码,终于发现有一个Java AC的了,然后我又有信心了。自己随便造了组数据,一下子发现错误了。。原来有个低级错误

出错的地方:


			for(int i=0;i<4;i++){
				int tx=sx+res[i][0];
				int ty=sy+res[i][1];	
				if(map[tx][ty]=='E'){//就是这里!!!!,下面判断了边界,这里忘了。。
					return step+1;
				}
				if(step>ans2)
					return 10000;		
				if(isin(tx,ty)&&(map[tx][ty]=='.'||map[tx][ty]=='E')&&!flag[tx][ty]){
					flag[tx][ty]=true;
					q.add(new point(tx,ty,step+1));	
				}
			}

AC代码:

/*
 * 思路是比较火山口和出口的哈密顿距离ans1与人和出口的最短距离ans2,如果ans1大于ans2则不能生还。
 * 
 * 
 */
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main {
	static int n,m;
	static char map[][]=new char[1005][1005];
	static boolean flag[][]=new boolean[1005][1005];
	static int res[][]={{1,0},{-1,0},{0,1},{0,-1}};
	static long ans1;
	static long ans2;
	static boolean isin(int x,int y){
		return x>=0&&x<n&&y>=0&&y<m;
	}
	static class point{
		int x,y,step;
		public point(int x,int y,int step){
			super();
			this.x=x;
			this.y=y;
			this.step=step;
		}
	}
	static int bfs(int sx,int sy,int step){
		point p=new point(sx,sy,step);
		Queue<point> q=new LinkedList<point>();
		q.add(p);
		flag[sx][sy]=true;
		while(!q.isEmpty()){
			point tp=q.poll();
			sx=tp.x;
			sy=tp.y;	
			step=tp.step;
			if(map[sx][sy]=='E'){
				return step;
			}
			if(step>ans2)
				return 10000;
			for(int i=0;i<4;i++){
				int tx=sx+res[i][0];
				int ty=sy+res[i][1];			
				if(isin(tx,ty)&&(map[tx][ty]=='.'||map[tx][ty]=='E')&&!flag[tx][ty]){
					flag[tx][ty]=true;
					q.add(new point(tx,ty,step+1));	
				}
			}
		}
		return 10000;
	}
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		while(sc.hasNext()){
			n=sc.nextInt();
			m=sc.nextInt();
			for(int i=0;i<n;i++){
				for(int j=0;j<m;j++){
					flag[i][j]=false;
				}
			}
			int sx=0,sy=0,fx=0,fy=0,ex=0,ey=0;
			for(int i=0;i<n;i++){
				String s=sc.next();
				for(int j=0;j<m;j++){
					map[i][j]=s.charAt(j);				
					if(map[i][j]=='S'){
						sx=i;
						sy=j;
					}else if(map[i][j]=='F'){
						fx=i;
						fy=j;
					}else if(map[i][j]=='E'){
						ex=i;
						ey=j;
					}
						
				}
			}
			ans2=Math.abs(ex-fx)+Math.abs(ey-fy);
			ans1=bfs(sx,sy,0);	
			if(ans1<=ans2)
				System.out.println("PIG PIG PIG!");
			else
				System.out.println("A! WO SI LA!");
		}
		sc.close();
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值