确实,最近临近期末,各种事情要多起来了,这估计是这学期最后一次acm的题了。由于时间因素只做了一道签到题就匆匆走人,不过完美ac签到题,也算是给这学期的acm画上了一个圆满的句号了吧,开始了自己的博客生涯,挺好。
B. Windows 画图
思路:这题根据题意,很容易想到直接模拟,而数据范围显示可以直接开二元数组强行记录,而对于直线上的点,可以分为斜率为非负,负和不存在三种情况,分别利用直线两点式遍历整数点进行更新记录就好了
/*
Author:Owen_Q
*/
#include <bits/stdc++.h>
using namespace std;
int ip[251][251];
int main()
{
int n,m,q;
memset(ip,0,sizeof(ip));
scanf("%d%d",&n,&m);
/*int a = 5;
int b = 3;
swap(a,b);
cout << a << b << endl;*/
for(int i=1;i<=n;i++)
{
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if((x1<x2&&y1<y2)||(x1>x2&&y1>y2))
{
if(x1>x2&&y1>y2)
{
swap(x1,x2);
swap(y1,y2);
}
int dx = x2-x1;
int dy = y2-y1;
for(int x=x1;x<=x2;x++)
{
int y = (x-x1)*dy;
if(y%dx == 0)
{
y = y / dx + y1;
ip[x][y] = i;
}
}
}
else if((x1<x2&&y1>y2)||(x1>x2&&y1<y2))
{
if(x1>x2&&y1<y2)
{
swap(x1,x2);
swap(y1,y2);
}
int dx = x2-x1;
int dy = y1-y2;
for(int x=x1;x<=x2;x++)
{
int y = (x-x1)*dy;
if(y%dx == 0)
{
y = y1 - y / dx;
ip[x][y] = i;
}
}
}
else
{
if(y2<y1)
{
swap(y1,y2);
}
for(int y=y1;y<=y2;y++)
{
ip[x1][y] = i;
}
}
}
scanf("%d",&q);
//cout << q << endl;
while(q--)
{
//cout << q << endl;
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",ip[x][y]);
}
return 0;
}