Wumpus


Time Limit: 2 Seconds     
Memory Limit: 65536 KB


One day Leon finds a very classic game called Wumpus.The game is as follow.

Once an agent fell into a cave. The legend said that in this cave lived a kind of monster called Wumpus, and there were horrible pits which could lead to death everywhere. However, there were also a huge amount of gold in the cave. The agent must be careful
and sensitive so that he could grab all of the gold and climb out of the cave safely.



The cave can be regarded as a n*n board. In each square there could be a Wumpus, a pit, a brick of gold, or nothing. The agent would be at position (0,0) at first and headed right.(As the picture below)

name=Wumpus1.png">

For each step, there are six possible movements including going forward, turning left, turning right, shooting, grabbing the gold, and climbing out of the cave. If the agent steps into a square containing a pit or Wumpus, he will die. When the agent shoots,
the Wumpus in front of him will die. The goal of the agent is to grab all of the gold and return to the starting position and climb out(it's OK if any Wumpus is still living).When a brick of gold is grabbed successfully, you will gain 1000 points. For each
step you take, you will lose 10 points.



Your job is to help him compute the highest point he can possibly get.



For the purpose of simplification, we suppose that there is only one brick of gold and the agent cannot shoot the Wumpus.

If there is a pit at (0, 0), the agent dies immediately. There will not be a Wumpus at (0, 0).

Input

There are multiple cases. The first line will contain one integer k that indicates the number of cases.



For each case:

The first line will contain one integer n (n <= 20).

The following lines will contain three integers, each line shows a position of an object. The first one indicates the type of the object. 1 for Wumpus, 2 for pit and 3 for gold. Then the next two integers show the x and y coordinates of the object.

The input end with -1 -1 -1. (It is guaranteed that no two things appear in one position.)

Output

The output contains one line with one integer, which is the highest point Leon could possibly get. If he cannot finish the game with a non-negative score, print "-1".

Sample Input

2
3
1 1 1
2 2 0
3 2 2
-1 -1 -1
3
1 1 1
3 2 2
-1 -1 -1

Sample Output

850
870

Hint

For the sample 1, the following steps are taken:

turn left, forward, forward, turn right, forward, forward, grab, turn left, turn left, forward, forward, turn left, forward, forward, climb.

There are in all 15 steps, so the final score is 840. For the sample 2 , the path is as follow:


Author: JIANG, Kairong

Source: ZOJ Monthly, July 2022





转弯bfs。用四维标记

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <malloc.h>
#include <ctype.h>
#include <math.h>
#include <string>
#include <iostream>
#include <algorithm>
#include <queue>
#include <set>
using namespace std;
int n;
struct node
{
int x,y,gg,cost,fangxiang;
};
int vis[22][22][4][2];//一维,二维坐标。三维四个方向 四维金子拿了没有
int dir[4][2]= //zai 0 0
{
1,0, // 開始向右,1,0。
0,-1,
-1,0,
0,1,
};
char mp[22][22];
int judge(node &now)
{
if(now.x<0 ||now.y<0 ||now.x>=n ||now.y>=n)
return 0;
if(mp[now.x][now.y]==1)
return 0;
if(vis[now.x][now.y][now.fangxiang][now.gg])
return 0;
vis[now.x][now.y][now.fangxiang][now.gg]=1;
if(mp[now.x][now.y]==3 &&now.gg==0)
{
now.cost+=1000;
now.cost-=10;
now.gg=1;
}
return 1;
}
int bfs()
{
memset(vis,0,sizeof(vis));
queue<node>q;
node st,ed,now;
st.fangxiang=st.cost=st.gg=st.x=st.y=0;
q.push(st);
int ans=0;
while(!q.empty())
{
ed=q.front();
if(ed.x==0 &&ed.y==0)
ans=max(ans,ed.cost);
q.pop();
for(int i=-1; i<=1; i++)
{
now=ed;
now.cost-=10;
if(i==0)
{
now.x+=dir[now.fangxiang][0];
now.y+=dir[now.fangxiang][1];
}
else
now.fangxiang=(now.fangxiang+i+4)%4;
if(judge(now))
q.push(now);
}
}
return ans-10;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int a,b,p;
int flag=0;
scanf("%d",&n);
memset(mp,0,sizeof(mp));
while(scanf("%d%d%d",&a,&b,&p)!=EOF&&a!=-1 &&b!=-1&&p!=-1)
{
if(a==1)
mp[b][p]=1;
else if(a==2)
{
mp[b][p]=1;
if(b==0 &&p==0)
flag=1;
}
else if(a==3)
mp[b][p]=3;
}
int ans1=bfs();
if(flag)
{
cout<<-1<<endl;
continue;
}
if(ans1<0)
cout<<-1<<endl;
else
cout<<ans1<<endl;
}
return 0;
}

ZOJ 3890 Wumpus的更多相关文章

  1. ZOJ - 3890 Wumpus(BFS基础题)

    Wumpus Time Limit: 2 Seconds      Memory Limit: 65536 KB One day Leon finds a very classic game call ...

  2. ZOJ People Counting

    第十三届浙江省大学生程序设计竞赛 I 题, 一道模拟题. ZOJ  3944http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=394 ...

  3. ZOJ 3686 A Simple Tree Problem

    A Simple Tree Problem Time Limit: 3 Seconds      Memory Limit: 65536 KB Given a rooted tree, each no ...

  4. ZOJ Problem Set - 1394 Polar Explorer

    这道题目还是简单的,但是自己WA了好几次,总结下: 1.对输入的总结,加上上次ZOJ Problem Set - 1334 Basically Speaking ac代码及总结这道题目的总结 题目要求 ...

  5. ZOJ Problem Set - 1392 The Hardest Problem Ever

    放了一个长长的暑假,可能是这辈子最后一个这么长的暑假了吧,呵呵...今天来实验室了,先找了zoj上面简单的题目练练手直接贴代码了,不解释,就是一道简单的密文转换问题: #include <std ...

  6. ZOJ Problem Set - 1049 I Think I Need a Houseboat

    这道题目说白了是一道平面几何的数学问题,重在理解题目的意思: 题目说,弗雷德想买地盖房养老,但是土地每年会被密西西比河淹掉一部分,而且经调查是以半圆形的方式淹没的,每年淹没50平方英里,以初始水岸线为 ...

  7. ZOJ Problem Set - 1006 Do the Untwist

    今天在ZOJ上做了道很简单的题目是关于加密解密问题的,此题的关键点就在于求余的逆运算: 比如假设都是正整数 A=(B-C)%D 则 B - C = D*n + A 其中 A < D 移项 B = ...

  8. ZOJ Problem Set - 1001 A + B Problem

    ZOJ ACM题集,编译环境VC6.0 #include <stdio.h> int main() { int a,b; while(scanf("%d%d",& ...

  9. zoj 1788 Quad Trees

    zoj 1788 先输入初始化MAP ,然后要根据MAP 建立一个四分树,自下而上建立,先建立完整的一棵树,然后根据四个相邻的格 值相同则进行合并,(这又是递归的伟大),逐次向上递归 四分树建立完后, ...

随机推荐

  1. asp.net应用发布到IIS无法链接到oracle数据库

    遇到这个问题纠结了好久,试了好多的方法,其中我的问题是,先安装了.net frameword4然后又安装的IIS. 正确方式应该是先安装IIS 然后安装.net framework;且应用程序池没有启 ...

  2. javaScript函数提升及作用域

    代码片段: var a = 1; function foo() { console.log(a); //输出为undefined if (!a) { var a = 2; } alert(a); }; ...

  3. 诸葛马前课andoid app 应用

    前段时间学了点安卓开发的知识,也在同时,陪家人看了<新闺蜜时代 >的后面几集,其中,周小北提到了诸葛马前课. 于是网上查了些资料,学习了一下马前课的计算方法,本着程序服务生活的原则,省去不 ...

  4. [转]查询sqlserver 正在执行的sql语句的详细信息

    包含用户名,所在数据库,执行的sql语句,执行开始时间,驱动程序,主机名称 SELECT     [Spid] = session_Id, ecid, [Database] = DB_NAME(sp. ...

  5. 微信JS-SDK 选取手机照片并进行上传

    项目中遇到需要选取照片上传的需求,因为网页运行在微信的浏览器里面,所以用微信的 js-sdk 提供的选取照片功能,来进行项目开发.实际开发中需要用到微信web开发者工具,详细参考链接:https:// ...

  6. setTimeout和setInterval的使用

    引自(http://www.cnblogs.com/qiantuwuliang/archive/2009/06/20/1507304.html) 这两个方法都可以用来实现在一个固定时间段之后去执行Ja ...

  7. Ambari Auto Start(进程自动拉起)

    文章作者:luxianghao 文章来源:http://www.cnblogs.com/luxianghao/p/7886850.html  转载请注明,谢谢合作. 免责声明:文章内容仅代表个人观点, ...

  8. c++用指针交换数组

    对于指针一直很迷,今天看了一下指针交换数组,知识量很少,希望能帮助到大家. 利用指针来交换数组主要是为了节省时间嘛,有两种交换方式 第一种是写一个函数把数组传过去然后用swap交换,即可 代码如下: ...

  9. python/numpy/tensorflow中,对矩阵行列操作,下标是怎么回事儿?

    Python中的list/tuple,numpy中的ndarrray与tensorflow中的tensor. 用python中list/tuple理解,仅仅是从内存角度理解一个序列数据,而非数学中标量 ...

  10. laravel MethodNotAllowedHttpException错误一个原因

    前两天在写api的时候,出现一个之前都没有碰到过的问题,如图 可以说提示信息是很不友好了,然后打开错误日志,发现报了一个MethodNotAllowedHttpException这样的错误,这样错误我 ...