首页 > 代码库 > hdu1466 计算直线的交点数(找规律+数学)
hdu1466 计算直线的交点数(找规律+数学)
转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1466
计算直线的交点数
Problem Description
平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数。
比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行)。
比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行)。
Input
输入数据包含多个测试实例,每个测试实例占一行,每行包含一个正整数n(n<=20),n表示直线的数量.
Output
每个测试实例对应一行输出,从小到大列出所有相交方案,其中每个数为可能的交点数,每行的整数之间用一个空格隔开。
Sample Input
2 3
Sample Output
0 1 0 2 3
代码如下:
#include <cstring> #include <iostream> using namespace std; #define N 21 #define M (N-1)*N/2 int dp[N][M]; //dp[i][j] i是有i条直线 j代表交点个数 void solve() { int m = 0; memset(dp,0,sizeof(dp)); dp[0][0] = 1,dp[1][0] = 1; for(int i = 2; i <= 20; i++) { for(int k = 0; k < i; k++) { for(int j = 0; j <= k*(k-1)/2; j++) { if(dp[k][j]) { m = j+k*(i-k); dp[i][m] = 1;//标记 } } } } } int main() { int n; solve(); while(~scanf("%d",&n)) { printf("0"); for(int i = 1; i <= n*(n-1)/2; i++) { if(dp[n][i]) { printf(" %d",i); } } printf("\n"); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。