关闭

EOJ3268 神奇怪兽在哪里

24人阅读 评论(0) 收藏 举报
分类:

3268. 神奇怪兽在哪里

Time limit per test: 2.0 seconds

Memory limit: 256 megabytes

熊猫先生最近在玩一款单机游戏。

在游戏中,会有一张 n 行 m 列的地图(如样例中所示)。用 . 表示空地,用 * 表示怪兽,用 P 表示熊猫先生现在所在的位置。怪兽只有一个,所以由 * 组成的块一定是一个上下左右四连通块。游戏的规则是:熊猫先生要把怪兽「包住」,并且回到现在所在的位置,才能把怪兽消灭掉。

「包住」的含义是:走过的路径可以将怪兽封闭起来。只能在空地上行走。走过的路径可以相交,可以重叠,可以重复走,只要围住就好了。

由于这是一款在命令行下运行的复古单机游戏,熊猫先生只能按上下左右四个键,即他只能向上下左右四个方向移动。你能找到一种消灭怪兽的方法吗?

Input

输入包含多个测试文件,每个测试文件是单组测试数据。

第一行两个整数 n,m (1n,m100)。对于 30% 的数据,满足:1n,m20

接下来 n 行,每行一个长度为 m 的字符串,表示地图。

. 表示空地,* 表示怪兽,P 表示熊猫先生现在所在的位置。输入保证熊猫先生不会出现在「怪兽里面」。

Output

输出一行,一个字符串,表示要消灭怪兽所要执行的操作序列:

  • 向上走用 U 表示;
  • 向下走用 D 表示;
  • 向左走用 L 表示;
  • 向右走用 R 表示。

输入保证有解。输出任意一解即可。

Examples

input
6 10
..........
...***..P.
..**......
..*****...
.....***..
..........
output
DDDDLLLLLLULUUUURRRRRRDR

Note

样例给出的答案路径是:

.PPPPPPP..
.P.***.PP.
.P**....P.
.P*****.P.
.PP..***P.
..PPPPPPP.

答案可以有多种情形,围出下面的形式也是可以的:

.PPPPPPP..
.P.***.PP.
.P**PPPPP.
.P*****.P.
.PP..***P.
..PPPPPPP.

注意在这种方案中,走过的路发生了重叠。

你甚至还可以绕多圈,以至于变成了这样:

PPPPPPPPPP
PPP***PPPP
PP**PPPPPP
PP*****PPP
PPPPP***PP
PPPPPPPPPP

只要你的输出序列能让你回到原点,这种情况也是正确的。

中文题意不解释。

一开始看到这道题觉得常规搜索题,毕竟最近这一周一直在肝搜索。

但是一开始还是无从下手,不知道怎么搜。

后来想了一下,只需从起点出发,搜到任意的一个角落(把这个路径记录下来,然后绕一圈再回到原处就可以了。

所以是dfs,但这里一开始犯了一个错误。

就是dfs并不是一定搜的就是正确的。所以在回溯的时候需要删除末尾元素(vector真是好用。

绕过了这几个坑就没什么问题了。

dfs是要比bfs难一点啊...

//#include <bits/stdc++.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <queue>
#include <stack>
#include <algorithm>
#define __max(a,b)  (((a) > (b)) ? (a) : (b))
#define __min(a,b)  (((a) < (b)) ? (a) : (b))
using namespace std;
const int maxn = 500;
const int N = 2e3+10;
bool used[N][maxn];
bool Prime[maxn];
char maze[maxn][maxn];
typedef pair<int,int> P;
int dx[] = {-1,0,0,1,0,0};
int dy[] = {0,-1,1,0,0,0};
int dz[] = {0,0,0,0,-1,1};
typedef long long ll;
int t,n,m;//t记录到达四个角所需要的步数
int flag;
const char dire[5] = "ULRD";//映射方向
vector<int> ans;
void solve(int mode)//填充绕一圈的路径
{
    switch (mode) {
        case 0:
            for(int i = 0; i < n-1; i++)
                ans.push_back(0);
            break;
        case 1:
            for(int i = 0; i < m-1; i++)
                ans.push_back(1);
            break;
        case 2:
            for(int i = 0; i < m-1; i++)
                ans.push_back(2);
            break;
        case 3:
            for(int i = 0; i < n-1; i++)
                ans.push_back(3);
            break;
        default:
            break;
    }
}
void dfs(int x, int y){
    if(flag) return;
    used[x][y] = 1;
    if(x == 0 && y == 0){
        solve(3);solve(2);solve(0);solve(1);
        flag = 1;return;
        }
    if(x == 0 && y == m-1){
        solve(3);solve(1);solve(0);solve(2);
        flag = 1;return;
    }
    if(x == n-1 && y == 0){
        solve(0);solve(2);solve(3);solve(1);
        flag = 1;return;
    }
    if(x == n-1 && y == m-1){
        solve(1);solve(0);solve(2);solve(3);
        flag = 1;return;
    }
    for(int i = 0; i < 4; i++)
    {
        int px = dx[i] + x, py = dy[i] +y;
        if(maze[px][py] != '*' && px >= 0 && px < n && py >=0 && py < m && used[px][py] == 0)
        {
            t++;//到达四个角所需步数
            ans.push_back(i);
            used[px][py] = 1;
            dfs(px, py);
            if(flag) return;
            ans.pop_back();//回溯时如果不是搜到了就要删除末尾元素
            t--;//路径数量要减去1
        }
    }
}
int main()
{
    std::ios::sync_with_stdio(false);
    //freopen("/Users/vector/Desktop/input.txt", "r", stdin);
    cin>>n>>m;
    {
        memset(used,0,sizeof(used));
        for(int i = 0; i < n; i++)
            cin>>maze[i];
        for(int i = 0; i < n; i++)
            for(int j = 0; j < m; j++)
            {
                if(maze[i][j] == 'P')
                {dfs(i,j);break;}
            }
        for(int i = t-1; i >= 0; i--)
            ans.push_back(3-ans[i]);//反方向的路径加到末尾
        for(int i = 0; i < ans.size(); i++)
            cout<<dire[ans[i]];
        cout<<endl;
    }
    return 0;

}


0
0
查看评论

从奥特曼和小怪兽的决斗中分析java类和对象-初学者必须会的一个入门程序

首先,我们先明确什么是类,当然了奥特曼和小怪兽就属于类的范畴。它们各自属于某一事物的抽象集合,不是具体的东西,而是一个高度概括了的抽象概念。所有的类都可以是由生活中的模型演化而来,因此所有类其实都是源于生活,面向对象编程其实就是模拟现实生活。        ...
  • u011496891
  • u011496891
  • 2014-04-01 17:04
  • 1517

1007. 怪兽训练

Problem: 贝爷的人生乐趣之一就是约战马会长. 他知道马会长喜欢和怪兽对决,于是他训练了N只怪兽,并对怪兽用0到N-1的整数进行编号. 贝爷训练怪兽的方式是让它们一对一互殴. 两只怪兽互殴会发生以下三种可能的结果: 1) 什么事也没发生 2) 第一只怪兽永...
  • jzylf
  • jzylf
  • 2018-01-08 15:32
  • 90

小怪兽日记(二)

小怪兽终于又发表日记了,为什么小怪兽时隔这么久才发表第二篇博文呢,因为小怪兽为了要打败奥特曼,进行了好久的框架学习以及知识能量的补充,         今天,小怪兽刚刚结束了产品的第一次迭代检查,小怪兽发现原来小怪兽的竞争对手都那么强大,所以小怪兽也要加紧锻...
  • hxyhello
  • hxyhello
  • 2013-03-29 19:06
  • 761

JZOJ1204. 魔鬼杀手

Description你生活在一个怪兽世界里。你需要用魔法反抗这些怪兽。 每个怪兽都有一定的hit points,表示他们的生命值。你可以靠施魔法,降低怪兽的hit points.每个魔法都会有一定的damage,表示会减少被攻击者damage的hit point.一个怪兽被击败了当前仅当它的hi...
  • puppywolf
  • puppywolf
  • 2017-08-11 22:28
  • 153

51NOD-1670 打怪兽(排列组合)

大致思路:临走时粗略地看了一下题目,半路上才发现没看数据范围,而且没注意怪兽的能量值是0~n-1还是题目给定,就先按照0~n-1想了一下,结果很快就想出来了 又想如果能量值是题目给定该怎么做,发现这样不过是前者的加强版,也能运用排列组合轻松解决 首先知道期望计算公式为:E=∑p[i]*i; (i表...
  • idealism_xxm
  • idealism_xxm
  • 2016-06-03 22:42
  • 829

【Java类和对象】奥特曼打怪兽练习

【Java类和对象】奥特曼打怪兽练习 【实验目的】 通过写一个回合制的战斗过程,来练习在JAVA中,类和对象的应用。 【实验过程】 1.Aoteman.java 创建一个Aoteman类 public class Aoteman {   private String name;...
  • snda452258253
  • snda452258253
  • 2015-03-25 13:39
  • 931

Zookeeper_神奇的动物在哪里?

这几天学了zooKeeper。最初接触它的时候,是在学dubbo的时候,那时候需要搭建他和dubbo一起用。 第一次见它的时候,真的是不起眼,不知道dubbo为什么非要这么个玩意来配合,就是再内存里面存了一颗树嘛~ 当然在我第二次见它,开始好好的学习它的时候,才发现, 它是那么多美妙,加上它之后...
  • lj252217616
  • lj252217616
  • 2017-11-13 19:50
  • 34

那些天价床垫,到底神奇在哪里?

近日,看到一篇“神奇”床垫两万多 老人要买拦不住家里吵翻天的文章。小编看到后,真心觉得不算什么,咱们来看看那些真正的天价床垫。 1、Hästens Vividus的床垫价值9百万 这款名为Hästens Vividus的床垫是瑞典一家床垫制造商话费了10年研制出来的...
  • zizi1122
  • zizi1122
  • 2017-07-29 08:50
  • 471

神奇"HTTPS重定向网页"在哪里?

欢迎Follow我的GitHub, 关注我的简书. 我还没有看过J. K. 罗琳的”神奇动物在哪里”, 但是遇到过”神奇HTTPS重定向网页在哪里”, 这是一个关于WebView的故事. 在Android项目中, 为了更好地显示HTML网页, 必然需要重写WebView, 在其中添加一些默认属性. ...
  • u012515223
  • u012515223
  • 2017-03-30 11:39
  • 1945

上海市高校程序设计邀请赛暨华东师范大学第九届 ECNU Coder 程序设计竞赛 C. 神奇怪兽在哪里

题意:略.思路:先把 ∗* 连通块附近的 .. 位置存起来A={}A=\{\},然后拿P去一个一个连续的到达,到达用BFS写,存个路径,有一个小优化就是在某一次BFS过程中如果已经到达过一些位置,那么就没必要再BFS到这个位置了。 PS: 然后没想到的是跑的还飞快…猜测数据稍微有点弱…#inclu...
  • KEYboarderQQ
  • KEYboarderQQ
  • 2017-05-21 17:22
  • 423
    个人资料
    • 访问:2730次
    • 积分:351
    • 等级:
    • 排名:千里之外
    • 原创:33篇
    • 转载:6篇
    • 译文:0篇
    • 评论:0条