#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; 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; } } } cout << ANS.size() << endl; rep(i,(ll)ANS.size()){ cout << ANS[i].fi << " " << ANS[i].se << endl; } return 0; }