编辑代码

#include <iostream>
using namespace std;
#define get(a,i) (i<0?0:a[i])

int n, m, k;
int *list;
int minnum=-1;

int *lastnlist;
int *lastmlist;

void run(int maxn,int maxlevel,int level/*当前算出层级*/,int*arr/*算出值*/);
void run(int maxn,int maxlevel,int level/*当前算出层级*/,int*arr/*算出值*/){

    if(level>=maxlevel){
        //开始运行 一维编号存储在arr中
        int bclist[n];
        for(int index=0;index<maxlevel;index++){
            int i=(arr[index]-1)/m,j=(arr[index]-1)%m;
            bclist[index]=list[i*m+j];
        }
        bool then;
        do{
            then=false;
            for(int i=0;i<n-1;i++){
                int t=bclist[i];
                if(t<bclist[i+1]){
                    then=true;
                    bclist[i]=bclist[i+1];
                    bclist[i+1]=t;
                }
            }
        }while(then);
        
        if(minnum==-1||bclist[k-1]<minnum)minnum=bclist[k-1];
    }else{
        for(int i=get(arr,level-1)+1;i<=maxn;i++){
            arr[level]=i;
            int i_=(i-1)/m,j_=(i-1)%m;
            bool exit=false;
            for(int index_=0;index_<level;index_++){
                if(i_==lastnlist[index_])exit=true;
                if(j_==lastmlist[index_])exit=true;
            }
            if(exit)continue;
            lastnlist[level]=i_;
            lastmlist[level]=j_;

            run(maxn,maxlevel,level+1,arr);
        }
    }
}
int main() {
    cin >> n >> m >> k;

    list=new int[n*m];
    for(int i=0;i<m*n;i++){
        cin>>list[i];
    }

    
    int*a=new int[m*n];
    for(int i=0;i<m*n;i++){
        a[i]=0;
    }
    
    lastnlist=new int[n];
    lastmlist=new int[n];
    
    run(m*n,n,0,a);

    cout<<minnum<<endl;
    return 0;
}