G 小乐乐打游戏 bfs+曼哈顿距离 哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级) java bfs

链接:https://ac.nowcoder.com/acm/contest/301/G
来源:牛客网
 

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

        小乐乐觉得学习太简单了,剩下那么多的时间好无聊,于是便想打游戏。
        最近新出了一个特别火的游戏,叫吃猪,小乐乐准备玩一玩。
        吃猪游戏很简单,给定一个地图,大小为n*m,在地图中会随机出现一个火山口,只要小乐乐能逃离这个地图,他便能吃猪! 
        但吃鸡远没有那么简单:
        1.小乐乐每走一次只能上下左右四个方向中走一步。
        2.小乐乐每走一步,火山喷发的岩浆就会向四周蔓延一个格子,所有岩浆走过的地方都视为被岩浆覆盖。
        3.小乐乐碰到岩浆就会死。
        4.地图中还有很多障碍,使得小乐乐不能到达,但是岩浆却可以把障碍融化。
        5.小乐乐只有走到题目给定的终点才算游戏胜利,才能吃猪。
        小乐乐哪见过这场面,当场就蒙了,就想请帮帮他,告诉他是否能吃猪。

输入描述:

多组样例输入

第一行给定n,m,(1 <= n, m <= 1000)代表地图的大小。

接下来n行,每一行m个字符,代表地图,对于每一个字符,如果是'.',代表是平地,'S'代表小乐乐起始的位置,
'E'代表终点,'#'代表障碍物,'F'代表火山口。

输出描述:

输出只有一行。如果小乐乐能吃猪,输出"PIG PIG PIG!"。否则输出"A! WO SI LA!"。

 

示例1

输入

复制

3 3
F..
#S#
#.E

输出

复制

PIG PIG PIG!

 

bfs 只要把火山蔓延的距离条件加入的判断条件里就ok

java写了一发

import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

class node
{
   int x,y,step;
	public node(int x, int y, int step) {
		super();
		this.x = x;
		this.y = y;
		this.step = step;
	}
}
public class Main {
	
	
	static int n,m,sx,sy,ex,ey,fx,fy;
    static String[] map =new String[1005];
    static int [] dx={1,0,-1,0};
    static int [] dy={0,1,0,-1};
	static long bfs() {
		int [][] d=new int[n+5][m+5];
		for(int i=0;i<=n+4;i++)
			for(int j=0;j<=m+4;j++)
			{
				
				d[i][j]=1000000000;
			}
		
		Queue<node> q=new LinkedList<node>();
		node a=new node(sx,sy,0);
		q.offer(a);
		
		
		d[sx][sy]=0;
		
		while(q.size()!=0)
		{
			a=q.poll();
			
			if(map[a.x].charAt(a.y)=='E')
			{
				break;
			}
			
			for(int i=0;i<4;i++)
			{
		         node b=new node(a.x+dx[i],a.y+dy[i],0);
		           if(b.x>=0&&b.x<n&&b.y>=0&&b.y<m&&map[b.x].charAt(b.y)!='#'&&d[b.x][b.y]==1000000000&&(Math.abs(fy-b.y)>=d[a.x][a.y]||Math.abs(fx-b.x)>=d[a.x][a.y]))
		            {
		               d[b.x][b.y]=d[a.x][a.y]+1;
		               q.offer(b);
		            }
		           
			}
		}
		return d[ex][ey];
		
	}

	public static void main(String args[])throws IOException  {

		Scanner in = new Scanner(System.in);
		while(in.hasNext())
		{
			n=in.nextInt();
			m=in.nextInt();
			for(int i=0;i<n;i++)
			{
				map[i]=new String();
				map[i]=in.next();
				for(int j=0;j<m;j++)
				{
				 if(map[i].charAt(j)=='S')	
				 {
					 sx=i;
					 sy=j;
				 }
				 if(map[i].charAt(j)=='E')	
				 {
					 ex=i;
					 ey=j;
				 }
				 if(map[i].charAt(j)=='F')	
				 {
					 fx=i;
					 fy=j;
				 }
				}
			}
			if(bfs()!=1000000000)
				System.out.println("PIG PIG PIG!");
		        else
		        System.out.println("A! WO SI LA!");
			
		}

			
		}
		
	
	
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值