HDU 5301 Buildings(机智)

Description
n*m矩阵,黑格子的位置是(x,y),将剩下位置划分为多个矩阵,每个矩阵必须接触边缘,求出划分矩阵的最大最小面积
Input
多组用例,每组用例占一行包括四个整数n,m,x,y,以文件尾结束输入
Output
对于每组用例,输出划分矩阵的最大最小面积
Sample Input
2 3 2 2
3 3 1 1
Sample Output
1
2
Solution
通过矩阵变换位置把坏点转移到矩阵的右上角(对矩阵进行翻转),因为坏点在右上角,所以求坏点到矩阵右边的距离和坏点到矩阵底部的距离,然后对这两个距离进行比较,最后将这两个距离中较小的数与ans(ans是矩阵中较小边的中点距离)进行比较,较大的那个就是要求的答案。
Code

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int n,m,x,y;
    while(scanf("%d%d%d%d",&n,&m,&x,&y)!=EOF)
    {
        if(n>m)//先将矩阵变成n<m的 
        {
            swap(n,m);
            swap(x,y);
        }
        if(n==m&&x==(n+1)/2&&y==(m+1)/2)//如果矩阵为正方形且坏点在正方形正中间 
        {
            printf("%d\n",n/2);
            continue;
        }
        int ans=n/2+n%2;
        if(x==ans||x==ans+1||y==1||y==m)//如果黑格在两边或者在中线上下,则面积不变 
            printf("%d\n",ans);
        else
        {
            int temp1=max(x-1,n-x);
            int temp2=min(y,m-y+1);
            if(temp2<=ans)//取两者最小值与ans比较取最大值 
                printf("%d\n",ans);
            else
                printf("%d\n",min(temp1,temp2));
        }
    }
    return 0;
}

你可能感兴趣的:(HDU 5301 Buildings(机智))