#include<iostream>
#include<vector>
#include<queue>
#include<utility>
using namespace std;
vector<vector<int> > *m; //cmp的operator()用到
class cmp{
public:
bool operator()(const pair<int,int> &a,const pair<int,int> &b){ //注意,形参是坐标对,函数体內比较的却是形参对应的元素大小
return (*m)[a.first][a.second]<(*m)[b.first][a.second];
}
};
int solve(vector<vector<int> >&ma,int k)
{
m=&ma; //连接起来
bool vis[ma.size()][ma[0].size()];
priority_queue<pair<int,int>,vector<pair<int,int> >,cmp> q; //优先队列,实际上就是堆,存放着元素的坐标对而不是元素本身
q.push(make_pair(0,0)); //(0,0)是起点的坐标,从左上角开始
vis[0][0]=true; //访问到了就标记,以免重复访问
while(k>0){
pair<int,int> p=q.top(); //堆顶元素的下标出列,该下标对应的元素最小,参考cmp
q.pop();
int x=p.first;
int y=p.second;
if(x+1<ma.size()&&vis[x+1][y]==false){ //相邻的元素下标(下边)
vis[x+1][y]=true;
q.push(make_pair(x+1,y)); //入堆
}
if(y+1<ma[0].size()&&vis[x][y+1]==false){ //相邻的元素下标(右边)
vis[x][y+1]=true;
q.push(make_pair(x,y+1));
}
--k;
}
pair<int,int> p=q.top();
return ma[p.first][p.second];
}
int main() //测试
{
vector<vector<int> > ma;
vector<int> base;
base.push_back(1);
base.push_back(5);
base.push_back(7);
ma.push_back(base);
base.push_back(3);
base.push_back(7);
base.push_back(8);
ma.push_back(base);
base.push_back(4);
base.push_back(8);
base.push_back(9);
ma.push_back(base);
cout<<solve(ma,4)<<endl;
return 0;
}