#include #pragma GCC target("avx2") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") using namespace std; using ll = long long; const ll mod = 998244353; #define fi first #define se second #define rep(i,N) for(ll i=0;i dx={0,1,0,-1}; const vector dy={1,0,-1,0}; int main() { random_device seed_gen; mt19937 engine(seed_gen()); uniform_real_distribution dist(0,1); ll N,T; cin >> N >> T; vector> A(N,vector(N)); vector> B(N,vector(N)); ll SUM=0; rep(i,N) rep(j,N) cin >> A[i][j],B[i][j]=A[i][j]*(50-abs(2*i-19)-abs(2*j-19)),SUM+=B[i][j]; vector> ANS; ll ans=0; set>,vector>>>> s; ll Q=10000; rep(I,N) rep(J,N){ ll q=(Q*B[I][J])/SUM; while(q--){ vector> CNT; ll cnt=A[I][J]; ll i=I,j=J; CNT.push_back({i,j}); vector> used(N,vector(N,false)); used[i][j]=true; while((ll)CNT.size()> V; ll sum=0; rep(k,4){ ll ni=i+dx[k]; ll nj=j+dy[k]; if(ni<0||N<=ni) continue; if(nj<0||N<=nj) continue; if(used[ni][nj]) continue; V.push_back({k,B[ni][nj]}); sum+=B[ni][nj]; } if((ll)V.size()==0){ break; } ll X=sum*dist(engine); rep(k,(ll)V.size()){ X-=V[k].se; if(X<0){ i+=dx[V[k].fi]; j+=dy[V[k].fi]; used[i][j]=true; cnt+=A[i][j]; CNT.push_back({i,j}); break; } if(k+1==(ll)V.size()){ cout << "Error" << endl; } } } if(cnt>ans){ ans=cnt; ANS=CNT; } s.insert({cnt,{CNT,used}}); if((ll)s.size()>100){ s.erase(*s.begin()); } } } auto it=s.begin(); while(it!=s.end()){ vector> V=(*it).se.fi; vector> used=(*it).se.se; ll cnt=(*it).fi; ll L=V.size(); ll turn=1000; while(turn--){ ll l=(L-2)*dist(engine); ll r=l+2; if(V[l].fi==V[r].fi) continue; if(V[l].se==V[r].se) continue; ll x=V[l+1].fi,y=V[l+1].se; ll xx=V[l].fi+V[r].fi-x,yy=V[l].se+V[r].se-y; if(used[xx][yy]) continue; if(A[x][y]ans){ ans=cnt; ANS=V; } } it++; } cout << ANS.size() << endl; rep(i,(ll)ANS.size()){ cout << ANS[i].fi << " " << ANS[i].se << endl; } return 0; }