`
king_tt
  • 浏览: 2234762 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

UVa 10557 - XYZZY

 
阅读更多
FILE 10557-XYZZY 4446
23.50%
817
74.54%

题目链接

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=105&page=show_problem&problem=1498


题目类型: 搜索


题目:


The prototypical computer adventure game, first designed by Will Crowther on the PDP-10 in the mid-1970s as an attempt at computer-refereed fantasy gaming, and expanded into a puzzle-oriented game by Don Woods at Stanford in 1976. (Woods had been one of the authors of INTERCAL.) Now better known as Adventure or Colossal Cave Adventure, but the TOPS-10 operating system permitted only six-letter filenames in uppercase. See also vadding, Zork, and Infocom.


It has recently been discovered how to run open-source software on the Y-Crate gaming device. A number of enterprising designers have developedAdvent-style games for deployment on the Y-Crate. Your job is to test a number of these designs to see which are winnable.

Each game consists of a set of up to 100 rooms. One of the rooms is thestartand one of the rooms is thefinish. Each room has anenergy valuebetween -100 and +100. One-way doorways interconnect pairs of rooms.

The player begins in the start room with 100energy points. She may pass through any doorway that connects the room she is in to another room, thus entering the other room. The energy value of this room is added to the player's energy. This process continues until she wins by entering the finish room or dies by running out of energy (or quits in frustration). During her adventure the player may enter the same room several times, receiving its energy each time.

The input consists of several test cases. Each test case begins withn, the number of rooms. The rooms are numbered from 1 (the start room) ton(the finish room). Input for thenrooms follows. The input for each room consists of one or more lines containing:

  • the energy value for roomi
  • the number of doorways leaving roomi
  • a list of the rooms that are reachable by the doorways leaving roomi
The start and finish rooms will always have enery level 0.A line containing -1 follows the last test case.

In one line for each case, output "winnable" if it is possible for the player to win, otherwise output "hopeless".

题目翻译:


背景:典型的电脑冒险游戏,最早出现在1970年代中期的PDP-10电脑(数字设备公司DEC生产的)上,是由Will Crowther设计的。这是一种尝试由电脑裁判的奇幻游戏。1976年在斯坦福大学的Don Woods把它拓展成一个拼图游戏(Don Woods是INTERCAL的作者之一)。现在更出名的是冒险或巨大的洞穴探险游戏。但是PDP-10的操作系统只允许6个大写字母的文件名。更多信息请查询vadding, Zork,和Infocom.


最近人们发现如何在Y-Crate游戏设备上运行开源软件。很多企业的设计师都有部署开发好的Advent-Style风格游戏在Y-Crate上。你的工作就是测试这些设计是否可能获胜的。


每场比赛由一组100个房间组成。其中一个房间是起点,另一个房间是终点。 每个房间有一个能量值 ,从 -100到+ 100。其中有一些只能单向行走的门把这些房间连接起来。


玩家开始时会自动获得100点能量值。 她可以通过单向房间门进入另一个门,并且可以任意重复次数进入一个房间,而且每次进入那个房间都可以获得那个能量值(正的能量值是增加她的能量,负值减少她的能量)。如果在能量用完(变为0或者负数)之前能够走到终点房间,那么就可以赢。否则,就是输。


样例输入:

5
0 1 2
-60 1 3
-60 1 4
20 1 5
0 0
5
0 1 2
20 1 3
-60 1 4
-60 1 5
0 0
5
0 1 2
21 1 3
-60 1 4
-60 1 5
0 0
5
0 1 2
20 2 1 3
-60 1 4
-60 1 5
0 0
-1

样例输出:

hopeless
hopeless
winnable
winnable


分析与总结:

这题首先想到的就是用深搜来做。


仔细分析题目可以看出, 可以重复进入一个房间,也就是可以任意次数来往两个房间。这样的话,这个游戏就有个“BUG”:只要有两个相连的房间(循环的), 例如,其中一个为10, 另一个为-2, 那么便可以反复来玩这两个房间,从而可以获得一个无限大的能量! 这样的话,如果可以找到通往终点的路,由于可以获得无限能量,那么就一定可以赢的!


利用这一点,在进行深搜时,一旦发现可以进入之前走过的房间(即有环图),那么就可以进行判断,是否可以获得无限能量。如果可以获得无限能量的话,就再从当前这点开始搜索,看看能否到达终点,如果可以的话,那么就直接判定为胜利!


在网上搜这题解题报告时,会发现很多都是用什么SPFA做的,其实用DFS+特判就可以了。


AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#define INF 2147483646
using namespace std;
int nRoom, energy[105];
struct Node{
    int val;
    int nLeave;
    int reach[105];
};
Node room[105];
bool vis[105], flag; 
int que[100000];

// 这个搜索能获得无限能量的点能不能直接到达终点
void bfs(int pos){
    memset(vis, 0, sizeof(vis));
    vis[pos] = true;
    int front=0, rear=1;
    que[0] = pos;
    while(front < rear){
        int q = que[front++];
        if(q == nRoom){ flag=true; return; }
        for(int i=0; i<room[q].nLeave; ++i){
            int m = room[q].reach[i];
            if(!vis[m] && m>=1 && m<=nRoom) {
                vis[m] = true;
                que[rear++] = m;
            }
        }
    }
}

void dfs(int pos, int val){
    if(flag || pos<=0 || pos>nRoom) return;
 //   printf("Room %d : left = %d\n", pos, val+room[pos].val);
    if(val <= 0) return;
    if(pos==nRoom && val>0) { flag = true; return; }

    for(int i=0; i<room[pos].nLeave; ++i){
        int m=room[pos].reach[i];
        // 如果目标是访问过的,并且这次到目标比上次到目标的能量大
        // 那么可以获得无限能量, 直接搜这个点有没有路径到终点
        if(energy[m] && energy[m]<val+room[m].val) {
            bfs(pos);
            if(flag) return;
        }
        if(!energy[m] && val+room[m].val>0){
            energy[m] = val+room[m].val;
            dfs(m, val+room[m].val);
        }
    }
}

int main(){
#ifdef LOCAL
    freopen("input.txt", "r", stdin);
#endif
    while(~scanf("%d", &nRoom) && nRoom!=-1){
        for(int i=1; i<=nRoom; ++i){
            scanf("%d %d", &room[i].val, &room[i].nLeave);
            for(int j=0; j<room[i].nLeave; ++j)
                scanf("%d", &room[i].reach[j]);
        }

        memset(vis, 0, sizeof(vis));
        memset(energy, 0, sizeof(energy));
        energy[1] = 100;

        flag = false;
        dfs(1, 100);
        if(flag) printf("winnable\n");
        else printf("hopeless\n");
    }
    return 0;
}



—— 生命的意义,在于赋予它意义。

原创http://blog.csdn.net/shuangde800By D_Double












分享到:
评论

相关推荐

    PretendYoureXyzzy:纸牌游戏《反人类》的网络克隆

    假装你是Xyzzy A Cards Against Humanity克隆,服务器和Web客户端。 有关完整的详细信息,请参见WebContent / license.html。 注意:该项目仅与Tomcat 7一起使用,不支持所有其他版本。 当前,构建PYX的唯一方法是...

    atom-buffer-list:缓冲区列表(例如Emacs或xyzzy),可以保存关闭的文档

    缓冲区列表(缓冲区菜单),例如Emacs或xyzzy,可以保存/关闭文档。 特征 显示开幕文件清单 保存和/或关闭标记的文档 配置 像这样添加您的keymap.cson: 'atom-workspace': 'ctrl-x ctrl-b': 'buffer-list:show' ...

    pyx-metrics-processor:假装您是Xyzzy游戏玩法指标的处理框架

    假装您的度量处理器是Xyzzy。 从Apache Kafka(0.10.1.0或更高版本)中获取度量标准信息,并将其保存到PostgreSQL(9.5或更高版本;使用INSERT ... ON CONFLICT DO NOTHING)。 删除使用者偏移量后可以安全地重新...

    xyzzy.ansify:在 Common Lisp 的 xyzzy 中找不到的各种计划好的东西

    ANSI Common Lisp 中但不在 xyzzy 中的一系列计划好的东西。 安装 从网络安装程序 。 如何使用 我会暂时阅读它。 (eval-when (:execute :compile-toplevel :load-toplevel) (require "ansify")) ansify 实现的...

    xyzzy:更智能的Clojure拉链

    木乃伊类似于拉链的结构: 以易于检索的形式存储从根到所选节点的路径具有统一的内部树结构(每个分支节点中的:children矢量)基本原理我在...用法添加到您的project.clj : [mkremins/xyzzy " 0.3.4 " ]执照。 乱走。

    Xyzzy:假装您是Xyzzy UI的替代者

    先决条件 节点 npm 口(&gt; = 3.9.0) 安装 npm install 用法 gulp watch serve 转到 特征 ES6(+棉绒) SCSS HTTP服务器 LiveReload

    msgpack-python-0.4.2.tar

    &gt;&gt;&gt; packed = msgpack.packb(msgpack.ExtType(42, b'xyzzy')) &gt;&gt;&gt; msgpack.unpackb(packed) ExtType(code=42, data='xyzzy') You can use it with ``default`` and ``ext_hook``. See below. Note for msgpack ...

    xyzzy.github.io:我的个人博客的Jekyll来源

    标题"xyzzy.github.io:我的个人博客的Jekyll来源"表明这是一个基于Jekyll构建的个人博客项目,托管在GitHub上。"xyzzy.github.io"是用户在GitHub上的个人主页,通常这样的命名方式表示博客的网址。Jekyll是一款静态...

    Cards-against-VGSN

    Docker Your Xyzzy启用您的Xyzzy: docker pull emcniece/dockeryourxyzzy : Docker Hub: 支持的标签和相应的Dockerfile链接: latest , 4 ( )什么是Docker Your Xyzzy?这是“卡”克隆的容器化版本。 :warning...

    find_open_resolvers:查找开放递归域名服务器

    名称 find_open_resolvers -- 在给定的 IP 范围内查找开放的 DNS 解析器。... --fqdn Fully Qualified Domain Name to query for (www.xyzzy.net) --verbose be verbose --help display brief help --man displa

    DockerYourXyzzy:Dockerized Cards Against Humanity克隆-https

    Docker Your Xyzzy 启用您的Xyzzy: docker pull emcniece/dockeryourxyzzy : Docker Hub: 支持的标签和相应的Dockerfile链接: latest , 4 ( ) 什么是Docker Your Xyzzy? 这是“卡”克隆的容器化版本。...

    正则表达式获得一个 SubMatches 集合以及它的专有成员.doc

    retStr = retStr & "组织是: " & oMatch.SubMatches(1) ' xyzzy SubMatchTest = retStr End Function Sub SubMatchesTest() MsgBox(SubMatchTest("请写信到 dragon@xyzzy.com 。 谢谢!")) End Sub ``` #### ...

    xpasswd:xpasswd - 用于消化和验证密码的库

    默认摘要版本配置在xpasswd....digest ( "xyzzy" ) . then ( function ( key ) { console . log ( key ) ; // use Promise chaining to validate the password return validate ( "xyzzy" , key ) ; } ) .

    overflow-normal

    这是一个简单的C程序,用于验证用户输入的名称是否为"xyzzy"。如果验证通过,它会揭示一个所谓的"超级秘密"。代码中有两个主要函数:`verify` 和 `main`。 `verify` 函数接收一个字符串 `name`,将其转换为小写并...

    xforgot:用于生成密码重置令牌的库

    var token = xforgot ( { secret : "xyzzy" , salt : "foobar" } ) ; // Send token to user via URL... if ( xforgot . verify ( { token : token , secret : "xyzzy" , salt : "foobar" } ) ) { // Reset the ...

    08年考试答案1

    - 给定序列 A 和 B,手动计算过程涉及到逐行逐列比较并填充表格,最后读取表格底部的值作为最长公共子序列的长度,这里最长公共子序列是 "xyzzy" 或 "zy"。 这些知识点涵盖了计算机科学中算法设计与分析的基础,...

    CardsAgainstSociety

    假装你是Xyzzy A Cards Against Humanity克隆,服务器和Web客户端。 有关完整的详细信息,请参见WebContent / license.html。 注意:该项目仅与Tomcat 7一起使用,不支持所有其他版本。 当前,构建PYX的唯一方法是...

    sublime使用方法

    在这个示例中,当用户输入 `xyzzy` 并按下 Tab 键时,将插入 `"请输入您要插入的代码片段${1:name}"` 这段代码,并将光标定位在 `$1` 处,等待用户输入具体的值。这个功能极大地提高了编写代码的速度。 以上是 ...

    谷歌师兄的leetcode刷题笔记-yatex:Emacs的另一种LaTeX模式

    YaTeX在DOS和Windows上的其他杰出编辑器上都有兄弟,Vz,Wz,Hidemaru,xyzzy.如果您使用YaTeX系列,您可以在任何平台上以相同的界面编写您的文档。 yahtml 是一个诚实和明亮的 YaTeX 兼容的主要模式包,用于编写 ...

    谷歌师兄的leetcode刷题笔记-yatex:emacs的另一种tex模式//野鸟//

    YaTeX在DOS和Windows上的其他杰出编辑器上都有兄弟,Vz,Wz,Hidemaru,xyzzy.如果您使用YaTeX系列,您可以在任何平台上以相同的界面编写您的文档。 yahtml 是一个诚实和明亮的 YaTeX 兼容的主要模式包,用于编写 ...

Global site tag (gtag.js) - Google Analytics