杭电1466题

//计算直线的交点数
//m条直线的交点方案数
//=(m-r)条平行线与r条直线交叉的交点数 + r条直线本身的交点方案
//=(m-r)*r+r条之间本身的交点方案数(1<=r<=m)
#include <iostream>
#include <vector>
using namespace std;
int main()
{
 //使用多维数组实现,用到vector<int>(0)是对vector初始化(每个元素vector包括0个元素)否则不能对vector存入元素
 vector<vector<int> > array(21,vector<int>(0));
 array[1].push_back(0);
 array[2].push_back(0);
 array[2].push_back(1);
 int n;
 for(int i=3;i<21;i++)
 {
  array[i].push_back(0);
  for(int j=1;j<i;j++)
  {
   for(int k=0;k<array[j].size();k++)
   {
    int count = (i-j)*j+array[j][k];
    bool is_in = false;
    //判断添加的是否有重复的内容
    for(int m=0;m<array[i].size();m++)
    {
     if(count == array[i][m])
     {
      is_in = true;
      break;
     }
    }
    if(!is_in)
    {
     array[i].push_back(count);
    }
   }
  }
 }
 while(cin>>n)
 {
  int count = array[n].size();
  //冒泡排序
  for(int i=0;i<count;i++)
  {
   int t=count-i-1;
   for(int j=0;j<t;j++)
   {
    if(array[n][j]>array[n][j+1])
    {
     int temp = array[n][j];
     array[n][j] = array[n][j+1];
     array[n][j+1] = temp;
    }
   }
  }
  for(int k=0;k<count;k++)
  {
   //注:最后一个不要输出空格,否则会出现格式错误
   if(k==count-1)
    cout<<array[n][k];
   else
   {
       cout<<array[n][k]<<" ";
   }
  }
  cout<<endl;
 }
 return 0;
}

 


 

你可能感兴趣的:(杭电)