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。
你的任务就是帮他找到一个最小的矩形,这个矩形可以包括所有大钰儿认为两幅图中不同的像素点。
接下来输入两个N行M列的整数矩阵,代表图片的像素值,范围均为[0 10000]。注意,每个矩阵前均有一个空行。
如果不存在,则输出一个-1。
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;
}
/* 这道题的代码写得长了点,其实好多地方可以精简,比赛时没想那么多,代码长如果思路清晰还是可以的,思路清晰有助于快速检查错误*/
网站 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;
}
/* 这道题的代码写得长了点,其实好多地方可以精简,比赛时没想那么多,代码长如果思路清晰还是可以的,思路清晰有助于快速检查错误*/
相关文章推荐
- Android Toast 设置到屏幕中间,自定义Toast的实现方法,及其说明
- jquery 获得星期几-根据当前日期判断是星期几
- 栈的学习
- gridcontrol自定义格式创建
- caffe for windows(win7+VS2012+CUDA6.5)(上)
- 《Effective Java》单例模式创建多对象
- Java Web乱码分析及解决方式(一)——GET请求乱码
- 大数据学习笔记·研究现状
- 开机自动挂载cdrom和fstab文件内容详解
- leetcode——331——Verify Preorder Serialization of a Binary Tree
- 在410c上使用UART登录
- C++第4次实验- 学生类
- Android中一些提示的实现方法
- 最新版 CocoaPods 的安装流程
- C#实现PC和Arduino串口通信
- Get to know the Random Query Generator
- mksquash_lzma-3.2 编译调试记录
- 500.19和500.21错误的解决方法
- LINUX内核分析期末总结
- 关于前端的思考与感悟