NC21722. 关于我转生变成史莱姆这档事
描述
捕食者
捕食:将对象物吸入体内。不过,对象仍保有意识时,成功率将大幅减低。发动对象不限于有机物或无机物,也包括技能及魔法。
解析:能解析、研究吸收对象,生成制作可能之道具。物质条件备齐时,亦能进行复制。成功解析术式后,有机会学习对象技能、魔法。
胃袋:收纳捕食对象。此外,亦能保管解析后生成的物质。收纳进胃袋后将不受时间影响。
拟态:能重现吸收对象,行使同等能力。不过,只限成功解析情报的对象物。
隔离:收纳无法解析的有害效果,将其净化后还原成魔力。
大贤者
思考加速:将知觉速度提升至千倍。
解析鉴定:解析对象物,进行鉴定。
并列演算:能将欲解析的事物与思考区隔开来进行演算。
咏唱排除:行使魔法等技能时,无须咒文咏唱程序。
有一天,利姆鲁在这个世界最重要的人静被魔王带走,并将其困在一个n*n的迷宫内的某一处,迷宫的每个格子都可能有一只魔物,魔物的攻击力为a[i][j],因而利姆鲁只有当攻击力大于等于a[i][j]才能通过这个方格,否则就只能绕道(只能朝上下左右四个方向)而行。输入描述
第一行为一个正整数t(1<=t<=20),表示测试数据的数量。
每组数据第一行为一个正整数n(1<=n<=500),表示迷宫大小。
第2行至第n+1行,每行有n个整数,相邻两个数用空格隔开。第i行第j列的数a[i][j]表示这一个方格中的魔物的攻击力大小为a[i][j](0<=a[i][j]<=1e5)。
第n+2行为四个正整数sx,sy,ex,ey(相邻两个数用空格隔开),分别表示利姆鲁的坐标和静的坐标。(1<=sx,sy,ex,ey<=n)。
输出描述
利姆鲁初始的攻击力的最小值x(大于等于0的整数)。
示例1
输入:
1 5 1 2 3 4 5 1 2 3 4 7 3 4 2 1 3 7 8 1 2 3 3 1 2 3 6 1 1 5 5
输出:
6
说明:
其中一条使得初始攻击力最小的路线为(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(4,3)->(5,3)->(5,4)->(5,5),此时初始攻击力只要6,因而答案是6。C++14(g++5.4) 解法, 执行用时: 1485ms, 内存消耗: 4740K, 提交时间: 2018-12-23 20:17:52
#include<bits/stdc++.h> using namespace std; struct node{ int x,y,g; bool friend operator<(node c,node b) { return c.g>b.g; } }now,nx; int mp[510][510]; bool vis[510][510]={0}; int m[4][2]={1,0,-1,0,0,1,0,-1}; int n,sx,sy,ex,ey; void bfs() { memset(vis,0,sizeof vis); priority_queue<node>q; now.x=sx,now.y=sy,now.g=0; q.push(now); while(!q.empty()) { now=q.top();q.pop(); if(now.x==ex&&now.y==ey){printf("%d\n",now.g);return ;} for(int i=0;i<4;i++) { nx.x=now.x+m[i][0],nx.y=now.y+m[i][1]; if(nx.x<1||nx.x>n||nx.y<1||nx.y>n||vis[nx.x][nx.y])continue; nx.g=max(now.g,mp[nx.x][nx.y]); vis[nx.x][nx.y]=1; q.push(nx); } } } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&mp[i][j]); cin>>sx>>sy>>ex>>ey; bfs(); } return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 1086ms, 内存消耗: 4680K, 提交时间: 2018-12-23 15:49:08
#include<bits/stdc++.h> using namespace std; const int N=505; struct node{ int x,y,g; bool friend operator<(node c,node d) { return c.g>d.g; } }no,ne; int a[N][N],n,sx,sy,ex,ey,m[4][2]={1,0,-1,0,0,1,0,-1}; bool vis[N][N]; void bfs(){ memset(vis,0,sizeof(vis)); priority_queue<node>q; no.x=sx; no.y=sy; no.g=0; vis[no.x][no.y]=1; q.push(no); while(!q.empty()){ no=q.top(); q.pop(); if(no.x==ex&&no.y==ey){ printf("%d\n",no.g); return; } for(int i=0;i<4;i++){ ne.x=no.x+m[i][0]; ne.y=no.y+m[i][1]; if(ne.x<1||ne.x>n||ne.y<1||ne.y>n||vis[ne.x][ne.y])continue; ne.g=max(no.g,a[ne.x][ne.y]); vis[ne.x][ne.y]=1; q.push(ne); } } } int main(){ int T; scanf("%d",&T); while(T--){ scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&a[i][j]); scanf("%d%d%d%d",&sx,&sy,&ex,&ey); bfs(); } }