计蒜客习题:逃生
题目
样例
代码
#include<iostream>
using namespace std;
int a[1005][1005];
int main()
{
int n,m,x,y,v,c;
cin>>n>>m>>x>>y>>v>>c;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
a[x][y]=v;
for(int i=x-1;i>=1;i--)
{
if(a[i+1][y]>0) a[i][y]+=a[i+1][y];
else a[i][y]=-1;
if(a[i][y]>c) a[i][y]=c;
}
for(int i=x+1;i<=n;i++)
{
if(a[i-1][y]>0) a[i][y]+=a[i-1][y];
else a[i][y]=-1;
if(a[i][y]>c) a[i][y]=c;
}
for(int i=y+1;i<=n;i++)
{
if(a[x][i-1]>0) a[x][i]+=a[x][i-1];
else a[x][i]=-1;
if(a[x][i]>c) a[x][i]=c;
}
for(int i=y-1;i>=1;i--)
{
if(a[x][i+1]>0) a[x][i]+=a[x][i+1];
else a[x][i]=-1;
if(a[x][i]>c) a[x][i]=c;
}
for(int i=x-1;i>=1;i--)
for(int j=y-1;j>=1;j--)
{
if(a[i+1][j]>0&&a[i][j+1]>0) a[i][j]+=max(a[i+1][j],a[i][j+1]);
else if(a[i+1][j]>0) a[i][j]+=a[i+1][j];
else if(a[i][j+1]>0) a[i][j]+=a[i][j+1];
else a[i][j]=-1;
if(a[i][j]>c) a[i][j]=c;
}
for(int i=x+1;i<=n;i++)
for(int j=y-1;j>=1;j--)
{
if(a[i-1][j]>0&&a[i][j+1]>0) a[i][j]+=max(a[i-1][j],a[i][j+1]);
else if(a[i-1][j]>0) a[i][j]+=a[i-1][j];
else if(a[i][j+1]>0) a[i][j]+=a[i][j+1];
else a[i][j]=-1;
if(a[i][j]>c) a[i][j]=c;
}
for(int i=x-1;i>=1;i--)
for(int j=y+1;j<=m;j++)
{
if(a[i+1][j]>0&&a[i][j-1]>0) a[i][j]+=max(a[i+1][j],a[i][j-1]);
else if(a[i+1][j]>0) a[i][j]+=a[i+1][j];
else if(a[i][j-1]>0) a[i][j]+=a[i][j-1];
else a[i][j]=-1;
if(a[i][j]>c) a[i][j]=c;
}
for(int i=x+1;i<=n;i++)
for(int j=y+1;j<=m;j++)
{
if(a[i-1][j]>0&&a[i][j-1]>0) a[i][j]+=max(a[i-1][j],a[i][j-1]);
else if(a[i-1][j]>0) a[i][j]+=a[i-1][j];
else if(a[i][j-1]>0) a[i][j]+=a[i][j-1];
else a[i][j]=-1;
if(a[i][j]>c) a[i][j]=c;
}
cout<<max(max(a[1][1],a[1][m]),max(a[n][1],a[n][m]));
return 0;
}