题目来源:http://116.56.140.75:8000/JudgeOnline/problem.php?id=1726
1726: 分饼
时间限制: 1 Sec 内存限制: 64 MB题目描述
小明得到一块矩形的饼,为了和他的朋友们一起分享。于是,他决定将其切分。于是,出现了一个问题。已知了饼的高度和宽度,以及切割的刀数和每一刀的切法,那么这块饼将被分割成多少块呢?例如( 见图一 ):小明将一块高度为2和宽度为2的饼,横竖各切一刀,即得到4块饼。已知,每一刀都会切在饼上,而不会切在边缘或以外的范围,并且每一刀都不会重复切在同一处。小明非常困惑,于是请求你的帮助。 

输入
输入数据将有多组测试样例,首先输入一个正整数T,表示有T组测试样例。对于每组测试样例,先输入三个正整数m,n,k,(m表示矩形的高度,n表示矩形的宽度,k表示切割的刀数),接下来将有k行输入,每行输入4个正实数x1,y1,x2,y2( 以矩形的左下角作为坐标原点,(x1,y1)、(x2,y2)分别表示刀痕留在矩形边上的两个端点的坐标,其浮点型数值的精度要求精确到小数点后6位)。(0 < m < = 100 , 0< n < = 100 , 0 < = k < = 100)
输出
对于每组测试样例,要求输出切割后饼的块数,相邻的结果间用一个回车分隔。
样例输入
2
2 2 1
0 0 2 2
2 2 2
0 1 2 2
0 2 2 0
样例输出
2
4
提示
注意多次切割后,刀痕之间可能不想交,也可能相交于同一点。
解析:注意找出对应线点面之间的关系哦,欢迎留言哦
代码:
#include<iostream>
using namespace std;
struct
{
double a;
double b;
}node[110];
struct
{
int c;
double d;
double e;
}ji[110];
int main()
{
int t;
cin >> t;
while (t--)
{
int m, n, k;
cin >> m >> n >> k;
double x1, y1, x2, y2;
if (k == 0)
{
cin >> x1 >> y1 >> x2 >> y2;
cout << 1 << endl;
continue;
}
if (k == 1)
{
cin >> x1 >> y1 >> x2 >> y2;
cout << 2 << endl;
continue;
}
for (int i = 0; i < k; i++)
{
cin >> x1 >> y1 >> x2 >> y2;
if (x1 == x2)
{
node[i].a = 99999999.0;
node[i].b = x1;
}
else
{
node[i].a = (y2 - y1) / (x2 - x1);
node[i].b = y1 - node[i].a*x1;
}
}
int count = 0;
double x, y;
int num = 0;
int ok = 1;
for (int i = 0; i < k; i++)
{
for (int j = i + 1; j < k; j++)
{
if (node[i].a == node[j].a)
continue;
else if (node[i].a == 99999999.0)
{
x = node[i].b;
y = node[i].b*node[j].a + node[j].b;
if (y < m)
count++;
}
else if (node[j].a == 99999999.0)
{
x = node[j].b;
y = node[j].b*node[i].a + node[i].b;
if (y < m)
count++;
}
else
{
x = (node[i].b - node[j].b) / (node[j].a - node[i].a);
y = node[i].a*x + node[i].b;
if (x < n&&y < m)
count++;
}
if (ok)
{
ji[0].c = 1;
ji[0].d = x;
ji[0].e = y;
ok = 0;
}
else
{
int flag = 1;
for (int kk = 0; kk <=num; kk++)
{
if (x == ji[kk].d&&y == ji[kk].e)
{
ji[kk].c++;
}
else
{
flag = 0;
}
}
if (!flag)
{
ji[num + 1].d = x;
ji[num + 1].e = y;
ji[num + 1].c = 1;
num++;
}
}
}
}
int sum = 0;
for (int i = 0; i <= num; i++)
{
if (ji[i].c >= 3)
{
for (int j = 1; j < ji[i].c; j++)
sum -= j;
}
}
cout << k + count + 1 - sum << endl;
}
}
/**************************************************************
Problem: 1726
User: 201730685257
Language: C++
Result: 正确
Time:0 ms
Memory:1488 kb
****************************************************************/