您的位置:首页 > 其它

bnuoj 4351题美女来找茬 (第九届北京师范大学程序设计竞赛决赛)

2016-04-22 19:31 232 查看
 bnuoj 4351题美女来找茬
网站   https://www.bnuoj.com/v3/problem_show.php?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
# include <stdio.h>
struct point //记录输入的每个点情况
{
int x,y; // 行号和列号
int xs; // 像素值
int flat;
}quar1[205][205],quar3[205*205];
int judge(int a,int b)
{//保证b》a
if(a>b)
{
int temp=b;
b=a;
a=temp;
}
if( b-a >5)
return 1;
else return 0;
}
int main()
{

int nhigh,mwide;
scanf("%d%d",&nhigh,&mwide);
for(int i=1;i<=nhigh;i++)
{// i是行号,j是列号
for(int j=1;j<=mwide;j++)
{
scanf("%d",&quar1[i][j].xs);
quar1[i][j].x=i;
quar1[i][j].y=j;
quar1[i][j].flat=0;
}
}
int top=0;
for(int i=1;i<=nhigh;i++)
{
for(int j=1;j<=mwide;j++)
{
int temp;
scanf("%d",&temp);
quar1[i][j].flat=judge( temp,quar1[i][j].xs );
if(quar1[i][j].flat)
{
quar3[top++]=quar1[i][j];//quar3储存不正常的像素点
}
}
}
int minx=205,maxx=-1; //因为题目说最大 200*200的像素
int miny=205,maxy=-1;

if(top>=1)
{
for(int i=0;i<top;i++)
{
if(quar3[i].x<minx)
minx=quar3[i].x;
if(quar3[i].y<miny)
miny=quar3[i].y;
if(quar3[i].x>maxx)
maxx=quar3[i].x;
if(quar3[i].y>maxy)
maxy=quar3[i].y;
}
int x1,y1,x2,y2;
x1=minx;
y1=miny;
x2=maxx;
y2=maxy;
if(x1==x2&&y1==y2)
printf("-1\n");
else
printf("%d %d %d %d\n",x1,y1,x2,y2);
}
else
{
printf("-1\n");
}
return 0;
}

/*   这道题的代码写得长了点,其实好多地方可以精简,比赛时没想那么多,代码长如果思路清晰还是可以的,思路清晰有助于快速检查错误*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: