高分求解题
帮我用C++程序编下面一道题~~~急用~~编的好的还可以追加50分~~谢谢大家帮帮忙啊~~~我主要C++程序【问题描述】RJ最近发明了一个游戏,来考验自命不凡的贝茜。游戏...
帮我用C++程序编下面一道题~~~急用~~编的好的还可以追加50分~~谢谢大家帮帮忙啊~~~我主要C++程序
【问题描述】
RJ最近发明了一个游戏,来考验自命不凡的贝茜。游戏开始的时候,RJ会给贝茜一块木板,木板上面画着N (2 <= N <= 200)个不重合的点,其中第i个点的横、纵坐标分别为Xi和Yi (-1,000 <= Xi <=1,000;-1,000 <= Yi <= 1,000)。
贝茜可以选两个点画一条过它们的直线,当且仅当平面上不存在与画出直线平行的直线。游戏结束时贝茜的得分,就是她画出直线的总条数。为了在游戏中胜出,贝茜找到了你,希望你帮她计算一下最大可能得分。
【文件输入】
第1行: 输入1个正整数N
第2到N+1行: 每行为两个用空格隔开的整数Xi、Yi,描述点i的坐标。
【文件输出】
文件输出只有一个整数,表示贝茜的最大得分,即她能画出互不平行的直线条数。
【样例输入】
4
-1 1
-2 0
0 0
1 1
【样例输出】
4
【输出说明】
贝茜能画出以下4种斜率的直线:-1,0,1/3以及1。
N个点是任意取的~~那个“它们”很明显是指取出的两个点~~两个点是N个点里的任意两点 展开
【问题描述】
RJ最近发明了一个游戏,来考验自命不凡的贝茜。游戏开始的时候,RJ会给贝茜一块木板,木板上面画着N (2 <= N <= 200)个不重合的点,其中第i个点的横、纵坐标分别为Xi和Yi (-1,000 <= Xi <=1,000;-1,000 <= Yi <= 1,000)。
贝茜可以选两个点画一条过它们的直线,当且仅当平面上不存在与画出直线平行的直线。游戏结束时贝茜的得分,就是她画出直线的总条数。为了在游戏中胜出,贝茜找到了你,希望你帮她计算一下最大可能得分。
【文件输入】
第1行: 输入1个正整数N
第2到N+1行: 每行为两个用空格隔开的整数Xi、Yi,描述点i的坐标。
【文件输出】
文件输出只有一个整数,表示贝茜的最大得分,即她能画出互不平行的直线条数。
【样例输入】
4
-1 1
-2 0
0 0
1 1
【样例输出】
4
【输出说明】
贝茜能画出以下4种斜率的直线:-1,0,1/3以及1。
N个点是任意取的~~那个“它们”很明显是指取出的两个点~~两个点是N个点里的任意两点 展开
6个回答
展开全部
题意说的不清楚,理解不了。
第一,那N个点是怎么画的,有没有规律。
第二,贝茜可以选两个点画一条过它们的直线,“两个点”指N个点里的还是任意取两点,“它们”又指谁?
也就是说,能理解的就是要取两点画直线穿过某点,然后画的直线没有平行线的时候游戏结束,要求如何画出最多条直线。
可是输出的时候怎么输出?只输出几条?
感觉题说的很复杂,但是样例又很简单,迷糊。。。
第一,那N个点是怎么画的,有没有规律。
第二,贝茜可以选两个点画一条过它们的直线,“两个点”指N个点里的还是任意取两点,“它们”又指谁?
也就是说,能理解的就是要取两点画直线穿过某点,然后画的直线没有平行线的时候游戏结束,要求如何画出最多条直线。
可是输出的时候怎么输出?只输出几条?
感觉题说的很复杂,但是样例又很简单,迷糊。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
题目分析:
说通过从2到N+1行里的N个坐标的随即组合,来获得互不平行的直线.即判断共有多少个不同的斜率.这其实是数的组合问题.分放那.晚上给你程序.
说通过从2到N+1行里的N个坐标的随即组合,来获得互不平行的直线.即判断共有多少个不同的斜率.这其实是数的组合问题.分放那.晚上给你程序.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
//点类,存储横纵坐标,通过链表实现
//头文件point.h
#ifndef POINT_H
#define POINT_H
#include <iostream.h>
typedef struct point
{
int xValue;
int yValue;
point* next;
}point;
//点:包括横坐标、纵坐标
class Point
{
public:
Point();
~Point();
bool Add(int X, int Y);
point* GetHeadPoint();
private:
point* head;
};
#endif
//point.cpp,点类的方法实现
#include "point.h"
Point::Point()
{
head = NULL;
}
Point::~Point()
{
if(head != NULL)
delete head;
head = NULL;
}
//添加点,如果点已经存在,则返回false,否则返回true
bool Point::Add(int X, int Y)
{
point* temp = NULL;
point* newPoint = NULL;
newPoint = new point;
newPoint->xValue = X;
newPoint->yValue = Y;
newPoint->next = NULL;
if(head == NULL)
{
head = newPoint;
newPoint = NULL;
return true;
}
else
{
for(temp=head; temp->next!=NULL; temp=temp->next)
{
if(temp->xValue==X && temp->yValue==Y)
{
temp = NULL;
newPoint = NULL;
return false;
}
}
if(temp->xValue==X && temp->yValue==Y)
{
temp = NULL;
newPoint = NULL;
return false;
}
else
{
temp->next = newPoint;
temp = NULL;
newPoint = NULL;
return true;
}
}
}
point* Point::GetHeadPoint()
{
return head;
}
//斜率类,存储斜率值
//头文件slope.h, 链表实现
#ifndef SLOPE_H
#define SLOPE_H
#include <iostream.h>
typedef struct slope
{
double value;
slope* next;
}slope;
//斜率
class Slope
{
public:
Slope();
~Slope();
bool Add(double temp);
private:
slope* head;
};
#endif
//slope.cpp 斜率类的方法实现
#include "slope.h"
Slope::Slope()
{
head = NULL;
}
Slope::~Slope()
{
if(head != NULL)
delete head;
head = NULL;
}
//添加新的斜率,如果斜率已经存在则返回false,否则返回true
bool Slope::Add(double temp)
{
slope* tempSlope = NULL;
slope* newSlope = new slope;
newSlope->value = temp;
newSlope->next = NULL;
const double EPSINON = 0.00001;
if(head == NULL)
{
head = newSlope;
newSlope = NULL;
return true;
}
else
{
for(tempSlope=head; tempSlope->next!=NULL; tempSlope=tempSlope->next)
{
if(tempSlope->value-temp>=-EPSINON && tempSlope->value-temp<=EPSINON)
{
tempSlope = NULL;
newSlope = NULL;
return false;
}
}
if(tempSlope->value-temp>=-EPSINON && tempSlope->value-temp<=EPSINON)
{
tempSlope = NULL;
newSlope = NULL;
return false;
}
else
{
tempSlope->next = newSlope;
tempSlope = NULL;
newSlope = NULL;
return true;
}
}
}
//测试程序,统计直线的总数,test.cpp
#include <iostream.h>
#include "point.h"
#include "slope.h"
int TotalLine(point* head);
void main()
{
Point* p = new Point();
int N = 0;
int Xi, Yi;
int i, count;
do{
cout<<"请输入点的个数[2,200]:"<<endl;
cin>>N;
}while(N<2 || N>200);
cout<<"请输入横坐标[-1000, 1000]、纵坐标[-1000, 1000]:"<<endl;
for(i=0; i<N; i++)
{
cin>>Xi>>Yi;
if(!p->Add(Xi, Yi))
{
cout<<"该坐标已经存在,请重新输入"<<endl;
i--;
}
}
count = TotalLine(p->GetHeadPoint());
cout<<"符合条件的直线总条数为:"<<count<<endl;
}
int TotalLine(point* head)
{
int Xi,Xj;
int countOfNoSlope = 0;
int totalLine = 0;
double tempSlope;
point* tempI = NULL;
point* tempJ = NULL;
Slope* s = new Slope();
for(tempI=head; tempI->next!=NULL; tempI=tempI->next)
{
for(tempJ=tempI->next; tempJ!=NULL; tempJ=tempJ->next)
{
Xi = tempI->xValue;
Xj = tempJ->xValue;
if(Xi == Xj) //斜率不存在的直线
{
if(countOfNoSlope > 0)
continue;
else
countOfNoSlope++;
}
else
{
tempSlope = double(tempI->yValue-tempJ->yValue) / (Xi-Xj);
if(s->Add(tempSlope)) //通过斜率判断是否有平行直线
totalLine++;
}
}
}
return totalLine + countOfNoSlope;
}
这是由本人自己写的哦,还算好用,你可以试一试,有问题再找我。
如果有疑问,请在该页面进行补充说明。
//头文件point.h
#ifndef POINT_H
#define POINT_H
#include <iostream.h>
typedef struct point
{
int xValue;
int yValue;
point* next;
}point;
//点:包括横坐标、纵坐标
class Point
{
public:
Point();
~Point();
bool Add(int X, int Y);
point* GetHeadPoint();
private:
point* head;
};
#endif
//point.cpp,点类的方法实现
#include "point.h"
Point::Point()
{
head = NULL;
}
Point::~Point()
{
if(head != NULL)
delete head;
head = NULL;
}
//添加点,如果点已经存在,则返回false,否则返回true
bool Point::Add(int X, int Y)
{
point* temp = NULL;
point* newPoint = NULL;
newPoint = new point;
newPoint->xValue = X;
newPoint->yValue = Y;
newPoint->next = NULL;
if(head == NULL)
{
head = newPoint;
newPoint = NULL;
return true;
}
else
{
for(temp=head; temp->next!=NULL; temp=temp->next)
{
if(temp->xValue==X && temp->yValue==Y)
{
temp = NULL;
newPoint = NULL;
return false;
}
}
if(temp->xValue==X && temp->yValue==Y)
{
temp = NULL;
newPoint = NULL;
return false;
}
else
{
temp->next = newPoint;
temp = NULL;
newPoint = NULL;
return true;
}
}
}
point* Point::GetHeadPoint()
{
return head;
}
//斜率类,存储斜率值
//头文件slope.h, 链表实现
#ifndef SLOPE_H
#define SLOPE_H
#include <iostream.h>
typedef struct slope
{
double value;
slope* next;
}slope;
//斜率
class Slope
{
public:
Slope();
~Slope();
bool Add(double temp);
private:
slope* head;
};
#endif
//slope.cpp 斜率类的方法实现
#include "slope.h"
Slope::Slope()
{
head = NULL;
}
Slope::~Slope()
{
if(head != NULL)
delete head;
head = NULL;
}
//添加新的斜率,如果斜率已经存在则返回false,否则返回true
bool Slope::Add(double temp)
{
slope* tempSlope = NULL;
slope* newSlope = new slope;
newSlope->value = temp;
newSlope->next = NULL;
const double EPSINON = 0.00001;
if(head == NULL)
{
head = newSlope;
newSlope = NULL;
return true;
}
else
{
for(tempSlope=head; tempSlope->next!=NULL; tempSlope=tempSlope->next)
{
if(tempSlope->value-temp>=-EPSINON && tempSlope->value-temp<=EPSINON)
{
tempSlope = NULL;
newSlope = NULL;
return false;
}
}
if(tempSlope->value-temp>=-EPSINON && tempSlope->value-temp<=EPSINON)
{
tempSlope = NULL;
newSlope = NULL;
return false;
}
else
{
tempSlope->next = newSlope;
tempSlope = NULL;
newSlope = NULL;
return true;
}
}
}
//测试程序,统计直线的总数,test.cpp
#include <iostream.h>
#include "point.h"
#include "slope.h"
int TotalLine(point* head);
void main()
{
Point* p = new Point();
int N = 0;
int Xi, Yi;
int i, count;
do{
cout<<"请输入点的个数[2,200]:"<<endl;
cin>>N;
}while(N<2 || N>200);
cout<<"请输入横坐标[-1000, 1000]、纵坐标[-1000, 1000]:"<<endl;
for(i=0; i<N; i++)
{
cin>>Xi>>Yi;
if(!p->Add(Xi, Yi))
{
cout<<"该坐标已经存在,请重新输入"<<endl;
i--;
}
}
count = TotalLine(p->GetHeadPoint());
cout<<"符合条件的直线总条数为:"<<count<<endl;
}
int TotalLine(point* head)
{
int Xi,Xj;
int countOfNoSlope = 0;
int totalLine = 0;
double tempSlope;
point* tempI = NULL;
point* tempJ = NULL;
Slope* s = new Slope();
for(tempI=head; tempI->next!=NULL; tempI=tempI->next)
{
for(tempJ=tempI->next; tempJ!=NULL; tempJ=tempJ->next)
{
Xi = tempI->xValue;
Xj = tempJ->xValue;
if(Xi == Xj) //斜率不存在的直线
{
if(countOfNoSlope > 0)
continue;
else
countOfNoSlope++;
}
else
{
tempSlope = double(tempI->yValue-tempJ->yValue) / (Xi-Xj);
if(s->Add(tempSlope)) //通过斜率判断是否有平行直线
totalLine++;
}
}
}
return totalLine + countOfNoSlope;
}
这是由本人自己写的哦,还算好用,你可以试一试,有问题再找我。
如果有疑问,请在该页面进行补充说明。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
楼上倒是写出来了,不过到200的时候已经能看出时间延缓了,算法有待于改进~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
c不行啊
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询