UVALive

编程入门 行业动态 更新时间:2024-10-27 19:29:46

<a href=https://www.elefans.com/category/jswz/34/1758933.html style=UVALive"/>

UVALive

题目大意:

给你一个N*M的地图,其中A是起点B是终点,0表示障碍,其他数字表示走到这个点的花费,我们现在要将没有障碍的地方逐渐放置障碍,直到A不能走到B为止,我们放置障碍得到的价值就是那个点的权值,我们希望这个权值和尽可能的大,问这个最大值。


思路:

记录sum表示所有点都能放置障碍的权值。

一开始写的是找A-->B的最短路shrot,然后记录这条路上的最大权值maxn,那么ans=sum-shrot+maxn.

然后找到一组错误数据:

1

4 4

A142
3790
2B55
1235  我的做法的结果是47.正解是48.

然后更改思路:


枚举一个点作为最后一个放置障碍的点,假设这个点放置完障碍之后使得A走不到B.

那么ans=max(ans,sum-(从A到这个点的距离+从B到这个点的距离-2*这个点的权值));

那么在一开始的时候跑两遍最短路再枚举即可。


Ac代码:

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
struct node
{int x,y,len;
}now,nex;
int n,m;
int kase;
int dis[150][150];
int dis2[150][150];
char a[150][150];
int fx[4]={0,0,1,-1};
int fy[4]={1,-1,0,0};
void Bfs(int sx,int sy)
{for(int i=0;i<n;i++){for(int j=0;j<m;j++){dis[i][j]=0x3f3f3f3f;}}queue<node >s;dis[sx][sy]=0;now.x=sx;now.y=sy;now.len=0;s.push(now);while(!s.empty()){now=s.front();s.pop();for(int i=0;i<4;i++){nex.x=now.x+fx[i];nex.y=now.y+fy[i];nex.len=now.len;if(nex.x>=0&&nex.x<n&&nex.y>=0&&nex.y<m&&a[nex.x][nex.y]!='0'){if(a[nex.x][nex.y]!='B')nex.len+=a[nex.x][nex.y]-'0';if(dis[nex.x][nex.y]>nex.len){dis[nex.x][nex.y]=nex.len;s.push(nex);}}}}
}
void Bfs2(int sx,int sy)
{for(int i=0;i<n;i++){for(int j=0;j<m;j++){dis2[i][j]=0x3f3f3f3f;}}queue<node >s;dis2[sx][sy]=0;now.x=sx;now.y=sy;now.len=0;s.push(now);while(!s.empty()){now=s.front();s.pop();for(int i=0;i<4;i++){nex.x=now.x+fx[i];nex.y=now.y+fy[i];nex.len=now.len;if(nex.x>=0&&nex.x<n&&nex.y>=0&&nex.y<m&&a[nex.x][nex.y]!='0'){if(a[nex.x][nex.y]!='B')nex.len+=a[nex.x][nex.y]-'0';if(dis2[nex.x][nex.y]>nex.len){dis2[nex.x][nex.y]=nex.len;s.push(nex);}}}}
}
int main()
{int t;kase=0;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);int sx,sy,ex,ey;for(int i=0;i<n;i++){scanf("%s",a[i]);for(int j=0;j<m;j++){if(a[i][j]=='A'){sx=i;sy=j;}if(a[i][j]=='B'){ex=i;ey=j;}}}Bfs(sx,sy);Bfs2(ex,ey);int sum=0;for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(a[i][j]>='0'&&a[i][j]<='9')sum+=a[i][j]-'0';}}int output=0;for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(a[i][j]!='0'&&a[i][j]!='B'&&a[i][j]!='A'){output=max(output,sum-(dis[i][j]+dis2[i][j]-2*(a[i][j]-'0')));}}}if(dis[ex][ey]==0x3f3f3f3f)printf("Case #%d: 0\n",++kase);else printf("Case #%d: %d\n",++kase,output);}
}







更多推荐

UVALive

本文发布于:2024-03-12 00:01:40,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1730237.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:UVALive

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!