首先使房间的行数n<列数,没有阻碍的话,是一半的n*1的矩形,有阻碍的话,除了在正中央的情况值比原来小1外,如果采用上下去填充的话是max(上,下),如果用左右去填充的话是min(左右),因为max(左右)那一部分可以采用上下的方式去填充,只要一半的n就就可以了, 然后取min (max(上,下),min(左右)),最个值如果比一半的n小的话,就改为一半的n,因为其它列还需要填充的
#pragma comment(linker, "/STACK:102400000,102400000") #include <iostream> #include<stdio.h> #include<string.h> #include<vector> #include<algorithm> #include<cmath> #include<map> #include<queue> #define lson l,m,rt<<1 #define rson m+1,r,rt<<1 | 1 #define lowbit(x) x&(-x) using namespace std; const int N=5e5+10; long long INF=-1e15; const int MOD=1e9+7; int T,n,m,k,x,y; int main() { #ifndef ONLINE_JUDGE freopen("aaa","r",stdin); #endif int T; while(~scanf("%d%d%d%d",&n,&m,&x,&y)){ if(n<=2 || m<=2){ puts("1"); continue; } if(n>m){ swap(n,m); swap(x,y); } int len=(n+1)/2; if(n==m && n&1 && x==y && x==(1+n)/2){ len--; }else{ int right=m-y+1; int left=y; int up=x-1; int down=n-x; len=max(min(max(up,down),min(left,right)),len); } printf("%d\n",len); } return 0; }