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 ...
随机推荐
- perl 学习笔记
一:基础 1:安装perl centos: yum -y install perl 官网:https://www.perl.org/ 升级到5.22:先下载,执行./i ...
- hdu1824-Let's go home:图论2-SAT
关键在于找出一定矛盾的条件,设一队的3个人为(a,b,c),a为队长,那么(a不留下,b不留下)矛盾,(a不留下,c不留下)矛盾; 对于每一对队员,(a留下,b留下)矛盾. 把模型建好,剩下的就是套模 ...
- C语言伪随机数的生成
在stdlib.h中,有两个函数与伪随机数的生成有关:srand和rand.C语言中,随机数表有很多列,srand函数是根据其参数(unsigned类型)来获得一个种子(seed),根据种子来设置从哪 ...
- MySQL数据库 常用操作
1:使用SHOW语句找出在服务器上当前存在什么数据库: mysql> SHOW DATABASES; 2:创建一个数据库MYSQLDATA mysql> CREATE DATABASE M ...
- curl 学习
<?php // $username =13800138000; // $password =123456; // $sendto =13912345678; // $message = &qu ...
- art.dialog
关闭指定弹出窗: art.dialog({ id: 'hetong' }).close(); 关闭所有的iframe弹出窗,art.dia.close();
- qt下面例子学习(部分功能)
from aa import Ui_Formfrom PyQt4.Qt import *from PyQt4.QtCore import *from PyQt4.QtGui import *from ...
- StroyBoard中UICollectionView中添加Header和footer
到Storyboard中,选择collection view controller中的"Collection View".在Attributes inspector中,选择&quo ...
- 学习selenium所须要具备的技术
学习selenium所须要具备的知识或技术 1.selenium进行的自己主动化測试是基于ui层面的,所以html,css,javascript基本上是不可缺少的,至于javascript,有非常多的 ...
- 常用aliyun公共资源列表
公共DNS 223.5.5.5 223.6.6.6 源软件镜像站点 mirros.aliyun.com NTP服务器 unix like ntp1-7. ...