题解 P1086 【花生采摘】
这道题我其实原本想用BFS的,结果写完了,才看到花生地里面没有障碍物,果断换上曼哈顿,(曼哈顿真是一个好东西)。按照题目要求一个一个地枚举就好了,如果有不知道曼哈顿的,百度一下,你就知道。:D(i,j)=abs(
话不多说,贴代码:
注释版:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
const int N=30;
int mp[N][N];
int n,m,k;
int tm;
int fx,fy,ex,ey;//起点,终点
int pn;
int ans;
struct dire//记忆花生地址
{
int x,y,sum;
}stu[N*N];
bool comp(struct dire a,struct dire b)//比较,大的在前,小的在后
{
return a.sum>b.sum;
}
int main()
{
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>mp[i][j];
if(mp[i][j]>0)//有花生 ,多多:我看到你们了
{
stu[++pn].sum=mp[i][j];//获得一系列有花生的坐标
stu[pn].x=i;
stu[pn].y=j;//保存坐标
}
}
}
sort(stu+1,stu+pn+1,comp);//按照题意来,先大后小
fx=1;
fy=stu[1].y;//设立你的初始位置
k--;//从人群中窜出一个光头,多多用了一个单位从人群中跳出
for(int i=1;i<=pn;i++)//枚举每一个有花生的点
{
tm=0;//计时器清零
ex=stu[i].x;
ey=stu[i].y;//设定多多的终点坐标
tm=abs(fx-ex)+abs(fy-ey);//求曼哈顿距离,计算本次导航距离
k--;//采花生
k-=tm;//剩余时间减去前往时间
if(k>=ex)//可以返回,装上花生
{
ans+=mp[ex][ey];//加入
fx=ex;
fy=ey;//路径规划成功,前往 fx,fy
}
else//多多如果去这个目标就回不去了,带上现在的花生米回去
{
cout<<ans<<endl;
return 0;
}
}
cout<<ans<<endl;//真棒,获得了全部的花生米
return 0;
}
无注释版:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
const int N=30;
int mp[N][N];
int n,m,k;
int tm;
int fx,fy,ex,ey;
int pn;
int ans;
struct dire
{
int x,y,sum;
}stu[N*N];
bool comp(struct dire a,struct dire b)
{
return a.sum>b.sum;
}
int main()
{
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>mp[i][j];
if(mp[i][j]>0)
{
stu[++pn].sum=mp[i][j];
stu[pn].x=i;
stu[pn].y=j;
}
}
}
sort(stu+1,stu+pn+1,comp);
fx=1;
fy=stu[1].y;
k--;
for(int i=1;i<=pn;i++)
{
tm=0;
ex=stu[i].x;
ey=stu[i].y;
tm=abs(fx-ex)+abs(fy-ey);
k--;
k-=tm;
if(k>=ex)
{
ans+=mp[ex][ey];
fx=ex;
fy=ey;
}
else
{
cout<<ans<<endl;
return 0;
}
}
cout<<ans<<endl;
return 0;
}