HDU 4156
HDU 4156
勾股定理
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
int a[4];
while(scanf("%d %d %d",&a[0],&a[1],&a[2]))
{
if(a[0]==a[1]&&a[1]==a[2]&&a[1]==0)
break;
else{
sort(a,a+3);
if(a[2]*a[2]==a[1]*a[1]+a[0]*a[0])
printf("right\n");
else printf("wrong\n");
}
}
return 0;
}
POJ 1269
POJ 1269
一道套kuangbin模板的题
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <map>
#include <vector>
#include <set>
#include <string>
#include <math.h>
using namespace std;
const double eps=1e-8;
int sgn(double x)
{
if(fabs(x)<eps) return 0;//x==0时
if(x<0) return -1;
else return 1;
}
struct point
{
double x,y;
point(){}
point(double _x,double _y)
{
x=_x;y=_y;
}
point operator -(const point &b)const//求直线向量
{
return point(x-b.x,y-b.y);
}
double operator^(const point &b)const
{
return x*b.y-y*b.x;//叉乘
}
double operator*(const point &b)const
{
return x*b.x-y*b.y;//点乘
}
};
struct line
{
point s,e;
line(){};
line(point _s,point _e)
{
s=_s;e=_e;
}
pair<int,point> operator&(const line&b)const
{
point res=s;
if(sgn((s-e)^(b.s-b.e))==0)//叉乘=0说明直线平行或者重合
{
if((sgn((s-b.e)^(b.s-b.e))==0))//求平行四边形面积,如果面积为0,则直线重合
return make_pair(0,res);
else return make_pair(1,res);
}
double t=((s-b.s)^(b.s-b.e))/((s-e)^(b.s-b.e));
res.x += (e.x-s.x)*t;
res.y += (e.y-s.y)*t;
return make_pair(2,res);//利用相似三角形的性质,求出两条直线的交点
}
};//pair可以将两个数据合成一个数据,make_pair可以直接生成pair变量
int main()
{
int n;
scanf("%d",&n);
double x1,x2,x3,x4,y1,y2,y3,y4;
printf("INTERSECTING LINES OUTPUT\n");
for(int i=0;i<n;i++)
{
scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);
line p1(point(x1,y1),point(x2,y2)),
p2(point(x3,y3),point(x4,y4));
pair<int,point> c=p1&p2;
if(c.first==0)
printf("LINE\n");
else if(c.first==1)
printf("NONE\n");
else
printf("POINT %.2f %.2f\n",c.second.x,c.second.y);
}
printf("END OF OUTPUT\n");
return 0;
}
POJ 1410
POJ 1410
依旧套模板,判断线段和图形有没有交点,可以分为以下几种情况:
1、如果线段至少一个端点在图形内,即有交点
2、如果两个端点都不在图形内,如果线段和图形要有交点,线段一定是穿过图形的边界的,即一定与图形的边界有交点
又因为题目里的图形规定好了是矩形,所以判断点是否在矩形内就非常容易
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <map>
#include <vector>
#include <set>
#include <string>
#include <math.h>
using namespace std;
const double eps=1e-8;
int sgn(double x)
{
if(fabs(x)<eps) return 0;//x==0时
if(x<0) return -1;
else return 1;
}
struct point
{
double x,y;
point(){}
point(double _x,double _y)
{
x=_x;y=_y;
}
point operator -(const point &b)const
{
return point(x-b.x,y-b.y);
}
double operator^(const point &b)const
{
return x*b.y-y*b.x;//叉乘
}
double operator*(const point &b)const
{
return x*b.x-y*b.y;//叉乘
}
};
struct line
{
point s,e;
line(){};
line(point _s,point _e)
{
s=_s;e=_e;
}
};
bool inter(line l1,line l2)
{
return
max(l1.s.x,l1.e.x) >= min(l2.s.x,l2.e.x) &&
max(l2.s.x,l2.e.x) >= min(l1.s.x,l1.e.x) &&
max(l1.s.y,l1.e.y) >= min(l2.s.y,l2.e.y) &&
max(l2.s.y,l2.e.y) >= min(l1.s.y,l1.e.y) &&
sgn((l2.s-l1.e)^(l1.s-l1.e))*sgn((l2.e-l1.e)^(l1.s-l1.e)) <= 0 &&
sgn((l1.s-l2.e)^(l2.s-l2.e))*sgn((l1.e-l2.e)^(l2.s-l2.e)) <= 0;
}
int main()
{
int n;
scanf("%d",&n);
int x1,x2,x3,x4,y1,y2,y3,y4;
for(int i=0;i<n;i++)
{
scanf("%d%d%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);
line line1(point(x1,y1),point(x2,y2)),
line2(point(x3,y3),point(x4,y3)),
line3(point(x4,y3),point(x4,y4)),
line4(point(x3,y4),point(x4,y4)),
line5(point(x3,y3),point(x3,y4));
if ((x1<=max(x3,x4)&&x1>=min(x3,x4)&&y1<=max(y3,y4)&&y1>=min(y3,y4))
&&(x2<=max(x3,x4)&&x2>=min(x3,x4)&&y2<=max(y3,y4)&&y2>=min(y3,y4)))
{
printf("T\n");
}
else if(inter(line1,line2)||inter(line1,line3)||inter(line1,line4)||inter(line1,line5))
{
printf("T\n");
}
else{
printf("F\n");
}
}
return 0;
}
POJ 2386
POJ 2386
用scanf输入char类型的时候
记 得 g e t c h a r!
#include <iostream>
#include <cstdio>
using namespace std;
int n,m,ans=0;
char a[110][110];
void dfs(int x,int y)
{
a[x][y]='.';
for(int i=-1;i<2;i++){
for(int j=-1;j<2;j++)
{
int mm,nn;
nn=x+i,mm=y+j;
if(mm<m&&mm>=0&&nn<n&&nn>=0&&a[nn][mm]=='W'){
dfs(nn,mm);
}
}}
return;
}
int main()
{
ans=0;
scanf("%d %d",&n,&m);
getchar();
for(int i=0;i<n;i++){
for(int j=0;j<m;j++)
scanf("%c",&a[i][j]);
getchar();}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++)
{
if(a[i][j]=='W'){
dfs(i,j);
ans++;
}
}}
printf("%d\n",ans);
return 0;
}