#include #include #include using namespace std; struct slogresenja{ int L; int X[300005]; int Y[300005]; long long score; } tempsol, finalsol, left, right; struct slogclanova{ int val; int X; int Y; } SA[1000005]; int dr[4]={1,0,-1,0}; int dc[4]={0,-1,0,1}; bool cmp(slogclanova a, slogclanova b){return a.val>b.val;} int A[1005][1005], CA[1005][1005], N, M, MAXL, p, bkp, dir [500000]; int B[1005][1005], done; void check(){ if (tempsol.L>finalsol.L){ finalsol.L=tempsol.L; for(int i=1; i<=finalsol.L; i++){ finalsol.X[i]=tempsol.X[i]; finalsol.Y[i]=tempsol.Y[i]; } } } void reset(){ tempsol.L=0; tempsol.score=0; memcpy(A,CA,sizeof(A)); memset(B, 0, sizeof(B)); done=false; } // //void dfs(int r, int c, int lastl, int lastr, int LL, int LR, int pathL){ // if (pathL>=MAXL) { // done=true; // return; // } // B[r][c]=true; // K=0; // MX=0; // for (int k=0; k<4; k++){ // if (B[r+dr[k][c+dc[k]])continue; // if (A[r+dr[k][c+dc[k]]>MX){ // MX=A[r+dr[k][c+dc[k]]; // K=k; // } // } // if //} void dfsKP(int r, int c){ B[r][c]=bkp; dir[bkp]++; for (int k=0; k<4; k++){ if (B[r+dr[k]][c+dc[k]]>0 or A[r+dr[k]][c+dc[k]]<0)continue; dfsKP(r+dr[k],c+dc[k]); } } void dfs1(int r, int c){ B[r][c]=1; tempsol.L++; // printf("[%d, %d] L==%d\n", r, c, tempsol.L); tempsol.X[tempsol.L]=r; tempsol.Y[tempsol.L]=c; check(); if (tempsol.L>=MAXL) {done=true; return;} for (int k=0; k<4; k++){ if (B[r+dr[k]][c+dc[k]]>0 or A[r+dr[k]][c+dc[k]]<0)continue; dfs1(r+dr[k],c+dc[k]); if (done)return; } tempsol.L--; } int main(){ freopen("path.in", "r", stdin); memset(CA,-1,sizeof(CA)); scanf ("%d %d",&N,&M); for (int i=1; i<=N; i++){ for (int j=1; j<=M; j++){ scanf("%d", &CA[i][j]); if (CA[i][j]<0) continue; SA[++p].val=CA[i][j]; SA[ p].X=i; SA[ p].Y=j; } } scanf ("%d",&MAXL); sort(SA+1, SA+p+1, cmp); // for (int i=1; i<=p; i++) printf("%d (%d,%d)\n",SA[i].val,SA[i].X,SA[i].Y); reset(); for (int i=1; i<=N; i++) for (int j=1; j<=M; j++){ if (B[i][j]==0 and A[i][j]>=0){ bkp++; dfsKP(i,j); } } // for (int i=1; i<=bkp; i++)printf("kp==%d brojevno==%d\n",i,dir[i]); int dokle=1000; if (N*M>10000) { if (MAXL<40000) dokle=10; else if (MAXL<100000) dokle=5; if (MAXL<200000) dokle=3; else dokle=2; } for (int i=1; i<=min(dokle,p); i++){ reset(); dfs1(SA[i].X, SA[i].Y); // printf("%d\n", tempsol.L); // for (int i=1; i<=tempsol.L; i++) // printf("%d %d\n", tempsol.X[i],tempsol.Y[i]); } freopen("path.out", "w", stdout); finalsol.L=min(finalsol.L, MAXL); printf("%d\n", finalsol.L); for (int i=1; i<=min(finalsol.L,MAXL); i++) printf("%d %d\n", finalsol.X[i],finalsol.Y[i]); return 0; }