UESTC_Just a Maze CDOJ 1162
Just a Maze
Time Limit: 3000/1000MS (Java/Others) Memory Limit: 262144/262144KB (Java/Others)
Here is a maze with N × M room.
You start from the room (SR,SC) and want to go to the room located at (TR,TC). However, there are many traps and monsters in this maze.
There are 4 types of rooms:
1. Blank->('.'). which has nothing.
2. Rock->('#'). which you can not enter it.
3. Trap->('a'~'z'), which once you enter it, you will suffer (Trap-'a'+1) damage(s). After you leave,the trap will reset so it can be triggered next time.
4. Monster->('A'~'Z'). If you go into a monster room or any room adjacent to a monster room, the monster will immediately rush up to you and fight with you. You will kill it, but you will get hurt too, suffering (Monster-'A'+1) damage(s). And the monster will not revive.
Two rooms are adjacent if and only if they share an edge. You can take 1 step to go from a room to another adjacent room.
The safest path is a lowest total damage path. Among all safest path,find the path with lowest steps.
Input
The first line contains two integers N and M (1≤N,M≤500).
The second line contains 4 integers SR,SC,TR,TC (1≤SR,TR≤N and 1≤SC,TC≤M).
For the next N lines, each line contains M characters indicating the map of maze. Each type of room is marked as:
1. Blank->('.')
2. Rock->('#')
3. Trap: from 'a'~'z'
4. Monster: from 'A'~'Z'
The damage you suffer from the trap 'a' is 1,'b' is 2..and so on.
The damage you suffer from the monster 'A' is 1... and 'Z' is 26.
The room (SR,SC) and (TR,TC) are always blank rooms and will not be adjacent to any monster room.
Output
Output the lowest total damage and the lowest steps in all safest path.
Sample input and output
| Sample Input | Sample Output |
|---|---|
3 5 |
4 6 |
Source
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <stack>
#include <map>
#include <set>
#include <queue>
#define pb push_back
#define show(x) cout << "x is " << x << endl
#define printarray(x,n) for(int i = 0 ; i < n ; ++ i) x == 0 ? cout << x[i] : cout << x[i] << " ";cout << endl
#define input_fast std::ios::sync_with_stdio(false);std::cin.tie(0)
#define local freopen("in.txt","r",stdin)
#define loop(x,st,ed) for(int x = st ; x < ed ; ++ x)
#define blackkey
typedef long long ll;
using namespace std;
const int maxn = + ; typedef struct status
{
int x , y ;
status(int x, int y )
{
this->x = x, this->y = y ;
}
}; typedef struct Edge
{
int x , y , co;
Edge(int x, int y , int co)
{
this->x = x , this->y = y , this->co = co;
}
}; typedef struct qst
{
int x , y , d1 , d2;
friend bool operator < (const qst & a , const qst & b)
{
if (a.d1 < b.d1)
return false;
else if(a.d1 == b.d1 && a.d2 < b.d2)
return false;
return true;
}
qst(int x,int y,int d1,int d2)
{
this-> x = x , this->y = y , this->d1 = d1 , this->d2 = d2;
}
}; typedef pair<int,int>pos;
typedef pair<pos,pos>spj;
int n , m , sr , sc , tr , tc , mincost[maxn][maxn][] , dir[][] = {-,,,,,,,-} , damage[maxn][maxn] , ban[maxn][maxn] , damage2[maxn][maxn] ,used[maxn][maxn] ;
char s[maxn][maxn];
vector<Edge>E[maxn][maxn];
set<spj>sb;
priority_queue<qst>q; inline int inmap(int x,int y)
{
return x <= n && x >= && y <= m && y >= ;
} int GetSameDamage(int x1,int y1,int x2,int y2)
{
int ans = ;
loop(i , , )
{
int newx = x1 + dir[i][];
int newy = y1 + dir[i][];
if (s[newx][newy] <= 'Z' && s[newx][newy] >= 'A')
{
loop(j , , )
if (x2 + dir[j][] == newx && y2 + dir[j][] == newy)
{
ans += s[newx][newy] - 'A' + ;
break;
}
}
}
return ans;
} void dijkstra()
{
q.push(qst(sr,sc,,));
memset(mincost,-,sizeof(mincost));
mincost[sr][sc][] = mincost[sr][sc][] = ;
while(!q.empty())
{
int x = q.top().x , y = q.top().y , d1 = q.top().d1 , d2 = q.top().d2 ; q.pop();
if (used[x][y])
continue;
used[x][y] = ;
loop(i , , )
{
int newx = x + dir[i][] , newy = y + dir[i][] ;
if (!inmap(newx,newy) || ban[newx][newy]) continue;
int newhurt = d1 + damage[newx][newy] + damage2[newx][newy] , newcost = d2 + ;
if ( newhurt < mincost[newx][newy][] || !(mincost[newx][newy][] ^ -) )
{
mincost[newx][newy][] = newhurt;
mincost[newx][newy][] = newcost;
q.push(qst(newx,newy,newhurt,newcost));
}
else if( !(newhurt ^ mincost[newx][newy][]) && newcost < mincost[newx][newy][])
{
mincost[newx][newy][] = newcost;
q.push(qst(newx,newy,newhurt,newcost));
}
}
loop(i , , E[x][y].size() )
{
int newx = E[x][y][i].x , newy = E[x][y][i].y , add = E[x][y][i].co;
int newhurt = d1 + damage[newx][newy] + damage2[newx][newy] - add, newcost = d2 + ;
if ( newhurt < mincost[newx][newy][] || !(mincost[newx][newy][] ^ -) )
{
mincost[newx][newy][] = newhurt;
mincost[newx][newy][] = newcost;
q.push(qst(newx,newy,newhurt,newcost));
}
else if( !(newhurt ^ mincost[newx][newy][]) && newcost < mincost[newx][newy][])
{
mincost[newx][newy][] = newcost;
q.push(qst(newx,newy,newhurt,newcost));
}
}
}
} int main(int argc,char *argv[])
{
//local;
memset(damage , , sizeof(damage));
memset(damage2 , , sizeof(damage2));
memset(used,,sizeof(used));
scanf("%d%d%d%d%d%d",&n,&m,&sr,&sc,&tr,&tc);
loop(i , , n + )
scanf("%s",s[i] + );
loop(i , , n + )
loop(j , , m + )
{
if (s[i][j] == '#')
ban[i][j] = ;
else if (s[i][j] <= 'z' && s[i][j] >= 'a')
damage[i][j] = s[i][j] - 'a' + ;
else if(s[i][j] <= 'Z' && s[i][j] >= 'A')
{
ban[i][j] = ;
loop(k , , )
damage2[i + dir[k][]][j + dir[k][]] += s[i][j] - 'A' + ;
loop(kx , , )
{
int newx = i + dir[kx][] ;
int newy = j + dir[kx][] ;
if (!inmap(newx,newy) || s[newx][newy] == '#') continue;
pos p1(newx,newy);
loop(k2 , , )
{
int tx = i + dir[k2][];
int ty = j + dir[k2][];
if ( !inmap(tx,ty) || s[tx][ty] == '#' || (tx ==newx && ty == newy)) continue;
pos p2(tx,ty);
spj ju = make_pair(p1,p2);
if (!sb.count(ju))
{
int co = GetSameDamage(newx,newy,tx,ty);
E[newx][newy].pb(Edge(tx,ty,co));
sb.insert(ju);
} }
}
}
}
dijkstra();
printf("%d %d\n",mincost[tr][tc][],mincost[tr][tc][]);
return ;
}
UESTC_Just a Maze CDOJ 1162的更多相关文章
- Backtracking algorithm: rat in maze
Sept. 10, 2015 Study again the back tracking algorithm using recursive solution, rat in maze, a clas ...
- (期望)A Dangerous Maze(Light OJ 1027)
http://www.lightoj.com/volume_showproblem.php?problem=1027 You are in a maze; seeing n doors in fron ...
- cdoj 1489 老司机采花
地址:http://acm.uestc.edu.cn/#/problem/show/1489 题目: 老司机采花 Time Limit: 3000/1000MS (Java/Others) M ...
- NYOJ题目1162数字
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAr8AAAJ/CAIAAAD+kywNAAAgAElEQVR4nO3dO1LjzN4H4G8T5CyE2A ...
- 1204. Maze Traversal
1204. Maze Traversal A common problem in artificial intelligence is negotiation of a maze. A maze ...
- uva705--slash maze
/*这道题我原本是将斜线迷宫扩大为原来的两倍,但是在这种情况下对于在斜的方向上的搜索会变的较容易出错,所以参考了别人的思路后将迷宫扩展为原来的3倍,这样就变成一般的迷宫问题了*/ #include&q ...
- HDU 4048 Zhuge Liang's Stone Sentinel Maze
Zhuge Liang's Stone Sentinel Maze Time Limit: 10000/4000 MS (Java/Others) Memory Limit: 32768/327 ...
- Borg Maze(MST & bfs)
Borg Maze Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9220 Accepted: 3087 Descrip ...
- poj 3026 bfs+prim Borg Maze
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9718 Accepted: 3263 Description The B ...
随机推荐
- Codeforces Round #272 (Div. 1) Problem C. Dreamoon and Strings
C. Dreamoon and Strings time limit per test 1 second memory limit per test 256 megabytes input stand ...
- Linux文件io--one简述
什么是文件IO IO就是input/output,输入/输出.文件IO的意思就是读写文件. 文件操作的主要接口API 什么是操作系统API (1)API是一些函数,这些函数是由linux系统提供支持的 ...
- 利用libevent的timer实现定时器interval
在不怎么了解libevent的情况下,看到timer这个关键字想到可以用来做定时任务,官方资料也不齐全,就从代码里看到了TIMEOUT字样,这么说来应该是支持timeout了,那interval呢,貌 ...
- c++ 之 字符和字符串
字符 1.字符的分类 字符主要包括字母.数字.标点符号.控制字符等 在ASCII编码表中,每一个字符都用一个十进制数来表示 注:ASCII的全称是American Standard Code for ...
- Android开发学习之Intent具体解释
Intent简单介绍和具体解释: Intent:协助应用间的交互与通信,Intent负责相应用中一次操作的动作.动作涉及的数据.附加数据进行描写叙述. ...
- 线程 (detach的作用)
线程状态在一个线程的生存期内,可以在多种状态之间转换.不同操作系统可以实现不同的线程模型,定义许多不同的线程状态,每个状 态还可以包含多个子状态.但大体说来,如下几种状态是通用的: 就 ...
- 使用xdebug+eclipse远程调试centOS7上的PHP代码
这两天一直在研究PHP代码的调试,原来开发一直用的var_dump,麻烦! 最近发现能使用xdebug+eclipse远程单步调试PHP,但是百度后实现此技术的文章都写得不够具体. 我照着这里零散的文 ...
- C#图像处理(4):图像的剪裁
图像的剪裁方法,从中间剪裁返回剪裁后的左右两页,方法实现如下: /// <summary> /// 图片裁剪,返回左右两页 /// </summary> /// <par ...
- silverlight visifire控件图表制作——silverlight 后台方法页面事件
1.返回事件 (1.返回silverlight页面,2.返回web页面) private void button_ClickBack(object sender, RoutedEventArgs e) ...
- html5响应式布局
1.media控制布局 <link type="text/css" rel="stylesheet" href="css04.css" ...