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 ...
随机推荐
- Permutations 解答
Question Given a collection of numbers, return all possible permutations. For example,[1,2,3] have t ...
- WPF - Build Error总结
1. are you missing an assembly reference 给项目添加新控件的时候,经常发现这种错误 Error 21 The type or namespace name 'C ...
- poj 2407 Relatives(简单欧拉函数)
Description Given n, a positive integer, how many positive integers less than n are relatively prime ...
- uiautomatorviewer 识别android微信元素报错
org.xml.sax.SAXParseException; systemId: file:/C:/Users/xxxxxxxxx/AppData/Local/Temp/uiautomatorview ...
- PyCharm常用设置
pycharm,优秀的python开发工具 本文介绍一点python开发工具,pycharm的使用方式. 内容仅仅为最常用的几点,想要了解更多,请自行谷歌. 1.常用工具栏 唤出常用工具栏,View ...
- maven java.lang.OutOfMemoryError:PermGEn space
配置环境变量: JAVA_OPTS-Xms512m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m MAVEN_OPTS-Xms256m -Xmx ...
- 使用apktool解包和打包apk
使用apktool解包和打包apk 下载apktool工具 解包 apktool d xxx.apk -f 植入代码 使用apktool解包要植入代码的apk(下面称为A), 使用apktool解包包 ...
- CSS 实现三角形、梯形、等腰梯形
三角形 ; width: 0px; border-width: 0px 30px 45px 145px; border-style: none solid solid; border-color: t ...
- 如何让网页打开就运行JS代码,不用onclick
打开网页直接运行是要调用window.onload( )函数: <html> <head> </head> <body> < ...
- ubuntu中安装Docker
系统要求: 必须时64位的系统,内核最低要求是3.10 查看系统内核: $ uname -r 3.11.0-15-generic 获取最新版本打Docker: $ wget -qO- https:// ...