题目连接:http://bailian.openjudge.cn/practice/4115/
这题就是紧接着拯救行动的变形。
直接贴代码吧,嘻嘻
不知道有没有喜欢我这种代码习惯或者风格的人
#include<iostream>
#include<algorithm>
#include<fstream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<cmath>
#include<cctype>
#include<vector>
#include<limits.h>
#include<queue>
using namespace std;
const int maxn=210;
struct mmp
{
int r,c;
int step;
int sum;
bool operator<(const mmp &w) const
{
if(step==w.step)
{
return sum>w.sum;
}
return step>w.step;
}
mmp(int rr,int cc,int u,int ss):r(rr),c(cc),step(u),sum(ss) { }
};
priority_queue<mmp>q1;
char s[maxn][maxn];
int vis[maxn][maxn];
int v[4][2]= {{0,1},{0,-1},{1,0},{-1,0}};
int n,m,t;
int bfs(int a,int b)
{
int i,x,y;
q1.push(mmp(a,b,0,0));
while(q1.empty()==0)
{
mmp m1=q1.top();
q1.pop();
for(i=0; i<4; ++i)
{
x=m1.r+v[i][0];
y=m1.c+v[i][1];
if(x>=0&&x<n&&y>=0&&y<m&&vis[x][y]==0)
{
vis[x][y]=1;
if(s[x][y]=='*'&&m1.sum<=t)
{
q1.push(mmp(x,y,m1.step+1,m1.sum));
}
if(s[x][y]=='#'&&m1.sum+1<=t)
{
q1.push(mmp(x,y,m1.step+1,m1.sum+1));
}
if(s[x][y]=='+')
return m1.step+1;
}
}
}
return -1;
}
int main()
{
int a,b,ans,i,j;
scanf("%d%d%d",&n,&m,&t);
for(i=0; i<n; ++i)
{
scanf("%s",s[i]);
}
memset(vis,0,sizeof(vis));
for(i=0; i<n; ++i)
{
for(j=0; j<m; ++j)
{
if(s[i][j]=='@')
{
a=i;
b=j;
}
}
}
ans=bfs(a,b);
cout<<ans<<endl;
return 0;
}