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 ...
随机推荐
- libeXosip2(2-3) -- eXosip2 event API
eXosip2 event API General purpose API. Data Structures struct eXosip_event Enumerations enum eXo ...
- Linux应用开发环境搭建
因为笔者是一名大学生,对Linux内核开发方向非常感兴趣,可是实在是能(ji)力(shu)有(cha)限(jin),仅仅能从Linux应用开发開始,由浅入深,逐步进步,登上人生高峰,因此,昨天搭建了开 ...
- 细说php(六) 数组
一.数组概述 1.1 数组是复合类型 1.2 数组中能够存储随意长度的数据, 也能够存储随意类型的数据 二.数组的类型 2.1 索引数组: 下标是顺序整数作为索引 <?php $user[0] ...
- Layer中自定义属性的动画
转载自:http://blog.jobbole.com/69211/ 默认情况下,CALayer 及其子类的绝大部分标准属性都可以执行动画,无论是添加一个 CAAnimation 到 Layer(显式 ...
- ArcEngine - 地图和布局同步
1,定义同步的类: using System; using System.Collections.Generic; using System.Linq; using System.Text; name ...
- NDK编译Python2.7.5
[背景] 网上有一些ndk编译python的做法,但按照教程做总是不成功,可能是环境版本不一样,导致很多地方的配置都不成功. 网上的教程大多只有做法,没有解释,即使按照教程编译成功,很多细节都不知道为 ...
- hdu5347 MZL's chemistry(打表)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud MZL's chemistry Time Limit: 2000/1000 MS ...
- Couchbase 使用方法
1.数据流向 List<模型> 数据-->MsgPack 打包成byte[]-> couchbase 实例调用 Store(Enyim.Caching.Memcached.S ...
- ssh-agent自启动加key脚本
公司使用到阿里云. 需要使用 ssh-agent forward 来跳转.为了方便自己就写了这个脚本 1 #!/bin/sh 2 # auto start ssh-agent and add key ...
- 用css实现一个空心圆,并始终放置在浏览器窗口左下角
用css实现一个空心圆,并始终放置在浏览器窗口左下角 div{ position:fixed; bottom:0; ...