#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int r, s, a, b, maxi;
ll arr[500][500], ans=1e18;
ll horizontal[500][500], vertikal[500][500];
ll count(ll x){
return abs(a-x)+abs(b-x);
}
void search(int x, int y, int i, int j, ll sum){
ans=min(ans, count(sum));
if(sum>maxi){
ll one=sum-(horizontal[x][j]-horizontal[x][y-1]);
search(x+1, y, i, j, one);
ll two=sum-(vertikal[i][y]-vertikal[x-1][y]);
search(x, y+1, i, j, two);
return;
}
if(i+1<=r){
ll rep= sum+horizontal[i+1][j]-horizontal[i+1][y-1];
search(x, y, i+1, j, rep);
}
if(j+1<=s){
ll rep= sum+vertikal[i][j+1]-vertikal[x-1][j+1];
search(x, y, i, j+1, rep);
}
return;
}
int main(){
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> r >> s >> a >> b;
maxi=max(a, b);
for(int i=1; i<=r; i++){
for(int j=1; j<=s; j++){
cin >> arr[i][j];
}
}
for(int i=1; i<=r; i++){
horizontal[i][0]=0;
for(int j=1; j<=s; j++){
horizontal[i][j]=horizontal[i][j-1]+arr[i][j];
}
}
for(int j=1; j<=s; j++){
vertikal[0][j]=0;
for(int i=1; i<=r; i++){
vertikal[i][j]=vertikal[i-1][j]+arr[i][j];
}
}
search(1,1,1,1, arr[1][1]);
cout <<ans<<endl;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |