Bnuoj 4315 美女来找茬

美女来找茬
Time Limit: 1000msMemory Limit: 65536KB 64-bit integer IO format: %lld Java class name: Main
Submit Status PID: 4351

寒假的时候,大钰儿在家闲得无聊,便玩起了QQ游戏美女来找茬。
他发现网络上高手很多,自己根本不是他们的对手。
于是,他心存”邪念”,写了一个作弊器(matlab版),瞬间有了千里眼的水平。
下面是作弊器的效果图,左图中的亮处便是两幅图不同的地方。

在写作弊器的时候,他遇到了一些问题,需要你来解决。
假设两张美女的图片都是N*M像素的整数矩阵,大钰儿认为两幅图中不同的像素点是指在同一像素点的像素值相差大于5的点。
如下面两个4*4的图片,大钰儿认为坐标为1 1和2 2的像素点是不同的。所以,能包括两个不同点的最小矩形左上角坐标为1 1,右下角坐标为2 2。

你的任务就是帮他找到一个最小的矩形,这个矩形可以包括所有大钰儿认为两幅图中不同的像素点。

Input
第一行两个整数,N和M(1<=N,M<=200),代表图片的高度和宽度。
接下来输入两个N行M列的整数矩阵,代表图片的像素值,范围均为[0 10000]。注意,每个矩阵前均有一个空行。

Output
如果存在不同的像素点,则输出一行整数x1 y1 x2 y2,x1 y1代表最小矩形的左上角行列坐标,x2 y2代表右下角的行列坐标,坐标从1 1开始。
如果不存在,则输出一个-1。

Sample Input
4 4

0 0 6 6
0 6 0 0
1 1 1 1
0 0 0 0

6 0 1 5
0 0 0 4
1 2 2 1
0 0 0 0

Sample Output
1 1 2 2

很简单的水题,但是在比赛的时候感觉好难,一开始以为是用Dp不停寻找最小的矩形,然后做了好久,然后又一直在用搜索尝试,结果还是没做出来。原来是一开始把题意搞错了。
其实题意是让你求一个能够包含所有差值的绝对值大于五的点的矩形,然后就是直接找左上角一个最小的x,y,再找一个右下角的最大的x,y,输出就可以了。还有就是数据有多组,不存在矩形的话标记输出-1。

代码:

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<string>
#include<string.h>
int a[205][205],b[205][205],ans[205][205];
int main()
{
    int n,m,k;
    while(~scanf("%d%d",&n,&m))
    {
        memset(ans,0,sizeof(ans));
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            scanf("%d",&a[i][j]);
         for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            {
                scanf("%d",&b[i][j]);
                k=b[i][j]-a[i][j];
                if(abs(k)>5)
                    ans[i][j]=1;//标记差值大于五的点;
            }
        int x2=-1,y2=-1,x1=10005,y1=10050,flag=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                if(ans[i][j]==1)
                {
                    flag=1;
                    if(x1>i)
                        x1=i;//最小的X;
                    if(y1>j)
                        y1=j;//最小的y;
                }
                if(ans[i][j]==1)
                {
                    if(x2<i)
                        x2=i;//最大的x;
                    if(y2<j)
                        y2=j;//最大的y;
                }
            }
        }
        if(!flag)
            printf("-1\n");
        else
            printf("%d %d %d %d\n",x1,y1,x2,y2);
    }
    return 0;
}


你可能感兴趣的:(Bnuoj 4315 美女来找茬)