2021第十二届蓝桥杯省赛c++B组_直线_set or map

//
求解方法:
构造所有直线 用 map 去重

难点在于 怎么确定直线唯一表示形式
01 两点式 2 点确定 1 条直线 但存在 4 个坐标值 注意到 不同的两点 可能确定同 1 条直线
02 点斜式 1 个斜率 2 个坐标值 直线经过很多点 哪个点具有代表性 ?
03 斜距式 1 个斜率 1 个截距 注意考虑到 斜率不存在的情况 —— ok

pair_

// set
#include<bits/stdc++.h>
using namespace std;

vector< pair<double,double> > v;
set< pair<double,double> > st;
set< pair<double,double> >::iterator it;

int main()
{
    int cnt=0,ans=20+21,i,j;
    double k,b;
	
	v.clear();
    for( i=0;i<20;i++ )			// 构造点 
        for( j=0;j<21;j++ )
            { v.push_back( make_pair( i,j ) ); cnt++; }
    
    st.clear();
    // 遍历两点 
    for( i=0;i<cnt;i++ )
    	for( j=0;j<cnt;j++ )
    	{
    		// 特殊处理 
    		if( v[i].first==v[j].first || v[i].second==v[j].second ) continue;
			
			k=( v[i].second-v[j].second )/( v[i].first-v[j].first );
			b=( v[i].first*v[j].second - v[j].first*v[i].second )/( v[i].first-v[j].first );
			// b=v[i].second-k*v[i].first; (x) 涉及精度问题  
			
            it=st.find( make_pair( k,b ) );
            if( it==st.end() ) { st.insert( make_pair( k,b ) ); ans++; }
		}
    cout<<ans<<endl;

    return 0;
}

// map
#include<bits/stdc++.h>
using namespace std;

struct point { double x,y; }p[25*25];

map< pair<double,double>,int >maps;

int main()
{
    int cnt=0,ans=20+21,i,j;
    double k,b;             // double 类型

    // 构造点
    for( i=0;i<20;i++ )
    {
        for( j=0;j<21;j++ )
        {
            p[cnt].x=i; p[cnt].y=j; cnt++;
        }
    }

    // 遍历两点
    for( i=0;i<cnt;i++ )
    {
        for( j=0;j<cnt;j++ )
        {
            // 特殊处理 横线和竖线
            if( p[i].x==p[j].x || p[i].y==p[j].y ) continue;

            k=( p[i].y-p[j].y )/( p[i].x-p[j].x );
            b=( p[i].x*p[j].y-p[j].x*p[i].y )/( p[i].x-p[j].x );
            // b=p[i].y-k*p[i].x; (x) 精度问题
 
            if( maps[ { k,b } ]==0 ) { maps[ { k,b } ]=1; ans++; }
        }
    }
    printf("%d\n",ans);

    return 0;
}

//
b=y-kx;
=y1-(y1-y2)/(x1-x2)*x1;
=( y1*x1-y1*x2 -y1*x1+y2*x1 )/( x1-x2 );
=( x1*y2-x2*y1 )/( x1-x2 );

猜你喜欢

转载自blog.csdn.net/qq_63173957/article/details/122785000#comments_20697801