ZOJ - 3890 Wumpus(BFS基础题)
2015-07-27 19:26
411 查看
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)
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).
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.)
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,每个格子对应了四个状态,方向状态,然后就是bfs辣。
acm半年了,又写了一次基础的搜索,莫名感概
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)
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,每个格子对应了四个状态,方向状态,然后就是bfs辣。
acm半年了,又写了一次基础的搜索,莫名感概
//Accepted 3890 C++ 0 280 //#pragma comment(linker, "/STACK:1024000000,1024000000") #include <iostream> #include <cstring> #include <cmath> #include <queue> #include <stack> #include <list> #include <map> #include <set> #include <sstream> #include <string> #include <vector> #include <cstdio> #include <ctime> #include <bitset> #include <algorithm> #define SZ(x) ((int)(x).size()) #define ALL(v) (v).begin(), (v).end() #define foreach(i, v) for (__typeof((v).begin()) i = (v).begin(); i != (v).end(); ++ i) #define REP(i,n) for ( int i=1; i<=int(n); i++ ) using namespace std; typedef long long ll; #define X first #define Y second typedef pair<ll,ll> pii; const int N = 25; int mp ; int n; bool vis [8]; struct node{ int x,y,dir,t; node(int x = 0,int y = 0,int dir = 0,int t= 0):x(x),y(y),dir(dir),t(t){} }; int dx[4]={1,0,-1,0}; int dy[4]={0,1,0,-1}; queue<node>que; int bfs(){ que.push(node(1,1,0,0)); vis[1][1][0] = 1; while(!que.empty()){ node cur = que.front(); que.pop(); int d = 0; if( mp[cur.x][cur.y] == 3 && cur.dir < 4){ if(vis[cur.x][cur.y][cur.dir+4] == 0){ que.push(node(cur.x,cur.y,cur.dir+4,cur.t+1)); vis[cur.x][cur.y][cur.dir+4] = 1; } continue; } if( cur.x == 1 && cur.y == 1 && cur.dir > 3) return 1000-(cur.t+1)*10; if( cur.x < 1 || cur.y < 1 || cur.x > n || cur.y > n) continue; if( mp[cur.x][cur.y] == 1 || mp[cur.x][cur.y] == 2) continue; if(cur.dir > 3){ d += 4; cur.dir -= 4; } if(vis[cur.x][cur.y][(cur.dir+1+4)%4+d] == 0){ que.push(node(cur.x,cur.y,(cur.dir+1+4)%4+d,cur.t+1)); vis[cur.x][cur.y][(cur.dir+1+4)%4+d] = 1; } if(vis[cur.x][cur.y][(cur.dir-1+4)%4+d] == 0){ que.push(node(cur.x,cur.y,(cur.dir-1+4)%4+d,cur.t+1)); vis[cur.x][cur.y][(cur.dir-1+4)%4+d] = 1; } if(vis[cur.x+dx[cur.dir]][cur.y+dy[cur.dir]][cur.dir+d] == 0){ que.push(node(cur.x+dx[cur.dir],cur.y+dy[cur.dir],cur.dir+d,cur.t+1)); vis[cur.x+dx[cur.dir]][cur.y+dy[cur.dir]][cur.dir+d] = 1; } } return -1; } void ini(){ memset(vis,0,sizeof(vis)); memset(mp,0,sizeof(mp)); while(!que.empty()) que.pop(); } int main(){ int T; cin>>T; while(T--){ scanf("%d",&n); ini(); while(true){ int a,x,y; scanf("%d%d%d",&a,&x,&y); if( a == -1 && x == -1 && y == -1) break; mp[++x][++y] = a; } if(mp[1][1] == 2) { puts("-1"); continue; } int ans = bfs(); if(ans < 0) puts("-1"); else printf("%d\n",ans); } }
相关文章推荐
- 你真的理解__block修饰符的原理么?
- hdu 3823 线性筛法
- BZOJ4227 : 城市
- 我的登山鞋
- 剑指Offer面试题7(Java版):用两个栈实现队列与用两个队列实现栈
- python中出现IndentationError:unindent does not match any outer indentation level错误
- android图片异步加载缓存2(1运行不了但是代码很优雅)
- 剑指offer:复杂链表复制
- C#高级编程五十九天----集合的性能
- Java调用存储过程返回数组
- Paypal获取Transaciton历史交易API初步研究(二)——Merchant API调用
- OC_类的扩展
- Codeforces Gym 100500F Problem F. Door Lock 二分
- 预定义规则 取范围数据
- c#扩展方法简单
- 文件重定向
- 函数的认知
- GraphLab面向机器学习的并行框架『针对图数据处理模型』
- 括号配对问题
- lightoj 1341 Aladdin and the Flying Carpet (唯一分解定理)