一道困扰很久的ACM题!“联想的显示屏校准”

Dream_WHui 2016-06-06 04:37:46
联想公司推出一款新型显示屏。该显示屏由 n 行 m 列的点阵组成。任选点阵中两个点可以构造出一条“基准线”,质检员通过校正每条基准线上的像素信息来确保显示屏没有一丝一毫的缺陷。现在,质检员想知道对于一个由 n 行 m 列的点阵组成的显示屏而言,有多少条不同的基准线。两条基准线不同当且仅当它们不重合,即两条基准线的交点数量是有穷的。

输入格式

第一行有一个正整数 T为数据组数,接下来有 T 行,每行两个正整数 n , m。

对于简单版本:T <=10 , 2 <= n , m <=40;

输出格式

输出一共有 T 行 ,每行一个整数,为该组数据的基准线数量。

样例输入

4
2 2
7 10
23 34
样例输出

6
1111
139395

思路:枚举任意两点,计算直线方程,再去重。
垂直坐标系的有m+n条
枚举时,只计算斜率为正的,(因为负的与正的是成对出现,最后结果*2即可)
代码:
#include <iostream>
#include <set>
#include <fstream>
using namespace std;

typedef pair<double,double> dd;
set<dd> hh;

void fun(int x0,int y0, int b, int a)
{
int count = 0;
for (int x=x0; x<b; ++x)
{
int y;
if(x==x0)
y=y0+1;
else
y=0;
double k,bb;
for (;y<a; ++y)
{
if(y != y0 && x != x0) //去掉处置坐标系的直线
{
k = (y-y0)*1.0/(x-x0);
if(k>0.0) //只计算斜率为正的直线
{
bb = y0-k*x0;
hh.insert(make_pair(k,bb));
}
}
}
}
}
int main()
{
int T;
while(cin>>T)
{
int a,b;
for(int i=0; i<T;++i)
{
cin>>a>>b;//a行,b列
hh.clear();
for (int x=0; x<b; ++x)
{
for (int y=0; y<a; ++y)
{
fun(x,y,b,a);//枚举
}
}
cout<<2*hh.size()+a+b<<endl;
}
}
return 0;
}


但是 , 样例过不了,帮忙看下 哪里有漏洞,或者有新的解题思想!!谢谢!!!
...全文
244 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
罗博士 2016-06-06
  • 打赏
  • 举报
回复
样例都过不了。输出中间结果,调试。
Dream_WHui 2016-06-06
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
字斟句酌 边界条件 大胆假设 小心求证
赵4老师 2016-06-06
  • 打赏
  • 举报
回复
字斟句酌 边界条件 大胆假设 小心求证

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧