1018 - Brush (IV)
| Time Limit: 2 second(s) | Memory Limit: 32 MB |
Mubashwir returned home from the contest and got angry after seeing his room dusty. Who likes to see a dusty room after a brain storming programming contest? After checking a bit he found an old toothbrush in his room. Since the dusts are scattered everywhere, he is a bit confused what to do. So, he called Shakib. Shkib said that, 'Use the brush recursively and clean all the dust, I am cleaning my dust in this way!'
So, Mubashwir got a bit confused, because it's just a tooth brush. So, he will move the brush in a straight line and remove all the dust. Assume that the tooth brush only removes the dusts which lie on the line. But since he has a tooth brush so, he can move the brush in any direction. So, he counts a move as driving the tooth brush in a straight line and removing the dusts in the line.
Now he wants to find the maximum number of moves to remove all dusts. You can assume that dusts are defined as 2D points, and if the brush touches a point, it's cleaned. Since he already had a contest, his head is messy. That's why he wants your help.
Input
Input starts with an integer T (≤ 1000), denoting the number of test cases.
Each case starts with a blank line. The next line contains three integers N (1 ≤ N ≤ 16). N means that there are N dust points. Each of the next N lines will contain two integers xi yi denoting the coordinate of a dust unit. You can assume that (-1000 ≤ xi, yi ≤ 1000) and all points are distinct.
Output
For each case print the case number and the minimum number of moves.
Sample Input |
Output for Sample Input |
|
2 3 0 0 1 1 2 2 3 0 0 1 1 2 3 |
Case 1: 1 Case 2: 2 |
1 #include<stdio.h>
2 #include<algorithm>
3 #include<string.h>
4 #include<stdlib.h>
5 #include<queue>
6 #include<iostream>
7 #include<math.h>
8 using namespace std;
9 typedef struct pp
10 {
11 int x;
12 int y;
13 } ss;
14 ss ans[200];
15 int line[20][20];
16 int ck[75550][20];
17 int dp[70000];
18 bool xian(pp a,pp b)
19 {
20 return (a.x*b.y-a.y*b.x)==0?true:false;
21 }
22 int main(void)
23 {
24 int i,j,k;
25 scanf("%d",&k);
26 int c;
27 int n,m;
28 for(i=0; i<(1<<16); i++)
29 {
30 int cc=i;
31 int u=0;
32 int t=1;
33 while(u<16)
34 {
35 if(cc%2==0)
36 {
37 ck[i][t]=u;
38 t++;
39 }
40 cc/=2;
41 u++;
42 }
43 ck[i][0]=t-1;
44 }
45 for(c=1; c<=k; c++)
46 {
47
48 memset(line,0,sizeof(line));
49 fill(dp,dp+65550,100);
50 scanf("%d",&n);
51 int xx;
52 int yy;
53 xx=0;
54 yy=0;
55 for(i=0; i<n; i++)
56 {
57 scanf("%d %d",&ans[i].x,&ans[i].y);
58 if(ans[i].x!=0||ans[i].y!=0)
59 xx=ans[i].x,yy=ans[i].y;
60 }
61 for(i=0; i<n; i++)
62 {
63 for(j=i+1; j<n; j++)
64 {
65 line[i][j]|=(1<<i);
66 line[i][j]|=(1<<j);
67 for(int s=0; s<n; s++)
68 {
69 ss nn;
70 nn.x=ans[i].x-ans[j].x;
71 nn.y=ans[i].y-ans[j].y;
72 ss mm;
73 mm.x=ans[s].x-ans[j].x;
74 mm.y=ans[s].y-ans[j].y;
75 bool ask=xian(nn,mm);
76 if(ask)
77 line[i][j]|=(1<<s);
78 }
79 line[j][i]=line[i][j];
80 }
81 }
82 int ak=(1<<n)-1;
83 dp[0]=0;
84 for(i=0; i<=ak; i++)
85 {
86 int uu=i;
87 int cn=0;
88 cn=ck[i][0];
89 cn-=(16-n);
90 if(n-cn==1)
91 dp[i]=1;
92 if(cn>=2)
93 {
94 int s;
95 for(j=1; j<=1; j++)
96 {
97 for(s=j+1; s<=cn; s++)
98 {
99 int v;
100 int t=line[ck[i][j]][ck[i][s]];
101 int de=i;
102 de|=t;
103 dp[de]=min(dp[de],dp[i]+1);
104 }
105 }
106 }
107 }
108 printf("Case %d: ",c);
109 printf("%d\n",dp[ak]);
110 }
111 return 0;
112 }
1018 - Brush (IV)的更多相关文章
- Lightoj 1018 - Brush (IV)
1018 - Brush (IV) PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB Muba ...
- [LightOJ 1018]Brush (IV)[状压DP]
题目链接:http://lightoj.com/volume_showproblem.php? problem=1018 题意分析:平面上有不超过N个点,如今能够随意方向划直线将它们划去,问:最少要划 ...
- Light OJ 1018 - Brush (IV)
题目大意: 一个二维平面上有N个点,一把刷子,刷一次可以把一条线上的所有点都刷掉.问最少刷多少次,可以把全部的点都刷完 状态压缩DP, 用记忆化搜索来写, 需要有个优化不然会超时. ===== ...
- Light oj 1018 - Brush (IV) 状态压缩
题目大意: 给出n个点的坐标,求至少画多少掉直线才能连接所有点. 题目思路:状态压缩 首先经行预处理,求出所有状态下,那些点不在该状态内 以任意两点为端点求出这条直线的状态 枚举所有状态,找出不在当前 ...
- (状压) Brush (IV) (Light OJ 1018)
http://www.lightoj.com/volume_showproblem.php?problem=1018 Mubashwir returned home from the contes ...
- Brush (IV) LightOJ - 1018
题意:平面上有一些点,每刷一次可以把同一条直线上的点都刷光,问最少几次把所有点刷光. 方法: 显然是一个状态压缩dp.ans[S]表示把S集合中点刷掉的最少次数.最开始想到的方法是如果S中只有一个或两 ...
- LightOJ1018 Brush (IV)(状压DP)
题目大概说一个平面有n个灰尘,可以用一把刷子直直刷过去清理直线上的所有灰尘,问最少要刷几下才能清理完所有灰尘. 首先怎么刷其实是可以确定的,或者说直线有哪些是可以确定的,而最多就有C(n,2)条不一样 ...
- lightoj刷题日记
提高自己的实力, 也为了证明, 开始板刷lightoj,每天题量>=1: 题目的类型会在这边说明,具体见分页博客: SUM=54; 1000 Greetings from LightOJ [简单 ...
- dp百题大过关(第一场)
好吧,这名字真是让我想起了某段被某教科书支配的历史.....各种DP题层出不穷,不过终于做完了orz 虽然各种手糊加乱搞,但还是要总结一下. T1 Monkey Banana Problem 这 ...
随机推荐
- IDEA高颜值之最吸引小姐姐插件集合!让你成为人群中最靓的那个崽!
经常有小伙伴会来找TJ君,可能觉得TJ君比较靠谱,要TJ君帮忙介绍女朋友.TJ君一直觉得程序猿是天底下最可爱的一个群体,只不过有时候不善于表达自己的优秀,所以TJ君今天准备介绍几款酷炫实用的IDEA插 ...
- mybatis缓存+aop出现的问题
在对某些特殊数据进行转换时,getOne方法后执行fieleInfoHandle进行转换,如果直接使用fixedTableData进行操作,没有后续的二次调用这样是没问题的,但是在后面当执行完upda ...
- Can we access global variable if there is a local variable with same name?
In C, we cannot access a global variable if we have a local variable with same name, but it is possi ...
- 【Python】【Basic】【数据类型】基本数据类型
1.数字 int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483647 在64位系统上,整数的位数为64位,取值范围为-2 ...
- 3.0 rust 项目路径
$ rustc --versionrustc 1.44.0 (49cae5576 2020-06-01) 将代码存在到不同的文件 main.rs mod aa; fn main() { println ...
- Dubbo多版本控制
当系统进行升级时,一般都是采用"灰度发布(又称为金丝雀发布)"过程.即在低压力时段,让部分消费者先调用新的提供者实现类,其余的仍然调用老的实现类,在新的实现类运行没有问题的情况下, ...
- Windows服务器java.exe占用CPU过高问题分析及解决
最近在测试一个用java语言实现的数据采集接口时发现,接口一旦运行起来,CPU利用率瞬间飙升到85%-95%,一旦停止就恢复到40%以下,这让我不得不面对以前从未关注过的程序性能问题. 在硬着头皮查找 ...
- Linux上Zookeeper集群搭建
一.官网 https://zookeeper.apache.org/ 二.下载安装 (1)下载 复制链接地址 http://mirror.bit.edu.cn/apache/zookeeper/zo ...
- 【C/C++】01背包问题/动态规划
按小蓝书上写的大数据情况下没过,按解答区一个大佬的修改了过了 #include <bits/stdc++.h> using namespace std; class Solution { ...
- python实现skywalking的trace模块过滤和报警
skywalking本身的报警功能,用起来视乎不是特别好用,目前想实现对skywalking的trace中的错误接口进行过滤并报警通知管理员和开发.所以自己就用python对skywalking做了二 ...