列表

详情


NC21561. 小乐乐打游戏

描述

        小乐乐觉得学习太简单了,剩下那么多的时间好无聊,于是便想打游戏。
        最近新出了一个特别火的游戏,叫吃猪,小乐乐准备玩一玩。
        吃猪游戏很简单,给定一个地图,大小为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!

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 63ms, 内存消耗: 2540K, 提交时间: 2018-12-01 17:05:31

#include<cstdio>
#include<queue>
#include<cstring>
#include<cstdlib>
using namespace std;
struct Node{
	int x,y,t;
	Node(){}
	Node(int a,int b,int c){
		x=a,y=b,t=c;
	}
}N;
const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int n,m,fx,fy,sx,sy,ex,ey;
char s[1108][1108];
bool book[1108][1108];
bool bfs()
{
	queue<Node> q;
	q.push(Node(sx,sy,0));
	memset(book,0,sizeof(book));
	book[sx][sy]=1;
	while(q.size())
	{
		N=q.front();
		q.pop();
		if(N.x==ex&&N.y==ey)
			return 1;
		for(int i=0;i<4;i++)
		{
			int dx=N.x+dir[i][0];
			int dy=N.y+dir[i][1];
			if(dx<0||dx>=n||dy<0||dy>=m)
				continue;
			if(book[dx][dy]||s[dx][dy]=='#'||abs(dx-fx)+abs(dy-fy)<=N.t)
				continue;
			book[dx][dy]=1;
			q.push(Node(dx,dy,N.t+1));
		}
	}
	return 0;
}
int main()
{
	while(~scanf("%d%d",&n,&m))
	{
		for(int i=0;i<n;i++)
		{
			scanf("%s",s[i]);
			for(int j=0;j<m;j++)
				if(s[i][j]=='F')
					fx=i,fy=j;
				else if(s[i][j]=='E')
					ex=i,ey=j;
				else if(s[i][j]=='S')
					sx=i,sy=j;
		}
		if(bfs())
			printf("PIG PIG PIG!\n");
		else
			printf("A! WO SI LA!\n");
	}
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 283ms, 内存消耗: 5088K, 提交时间: 2018-12-15 23:41:36

#include<bits/stdc++.h>
using namespace std;
char ma[1001][1001];
int vis[1001][1001];
int dir[4][2]= {0,1,1,0,-1,0,0,-1};
int n,m;
struct pos{
	int x;
	int y;
	int s;
}hs,xl,zd;
int bfs(void)
{
	memset(vis,0,sizeof(vis));
	queue<pos>q;
	vis[xl.x][xl.y]=1;
	q.push(xl);
	while(!q.empty())
	{
		pos now=q.front();
		q.pop();
		if(now.x==zd.x&&now.y==zd.y)
		return 1;
		for(int i=0;i<4;i++)
		{
			pos next=now;
			next.x=now.x+dir[i][0];
			next.y=now.y+dir[i][1];
			next.s+=1;
			if(!vis[next.x][next.y]&&ma[next.x][next.y]!='#'&&abs(next.x-hs.x)+abs(next.y-hs.y)>next.s)
			if(0<=next.x && next.x<n && 0<=next.y && next.y<m)
			vis[next.x][next.y]=1,q.push(next);
		}
	}
	return 0;
}
int main(void)
{
	int i,j;
	while(cin>>n>>m) 
	{
	for(i=0;i<n;i++)
	cin>>ma[i];
	for(i=0;i<n;i++)
	for(j=0;j<m;j++)
	{
		if(ma[i][j]=='F')
		hs.x=i,hs.y=j;
		if(ma[i][j]=='S')
		xl.x=i,xl.y=j;
		if(ma[i][j]=='E')
		zd.x=i,zd.y=j;
	}
	if(bfs())
	cout<<"PIG PIG PIG!"<<endl;
	else
	cout<<"A! WO SI LA!"<<endl;
}
}

上一题