根据弧度排个序,扫一遍就好了
如果用acos求弧度需要long double ,如果用atan求只需要double,主要就卡在精度问题
#include<bits/stdc++.h>
using namespace std;
struct node
{
long double ve;
int index;
}num[100005];
int cmp(node u ,node v)
{
return u.ve<v.ve;
}
int main()
{
int n,i,x,y;
long double minn,t;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d %d",&x,&y);
t=sqrt(x*x+y*y);
t=x/t;
if(y<0)
{
num[i].ve=2*acos(-1.0)-acos(t);
}
else
{
num[i].ve=acos(t);
}
num[i].index=i;
}
sort(num+1,num+n+1,cmp);
int ans1,ans2;
minn=1000;
num[n+1].ve=num[1].ve+2.0*acos(-1.0);
num[n+1].index=num[1].index;
for(i=2;i<=n+1;i++)
{
t=num[i].ve-num[i-1].ve;
if(t>acos(-1.0))
t=2.0*acos(-1.0)-t;
// printf("%.30lf %.30lf\n",t,2.0*acos(-1.0));
if(minn>t)
{
minn=t;
ans1=num[i].index;
ans2=num[i-1].index;
}
}
printf("%d %d\n",ans1,ans2);
return 0;
}
/*4
-6427 6285
-5386 5267
3898 -7239
3905 -7252*/
#include<bits/stdc++.h>
using namespace std;
char mapp[1005][1005];
bool book[1005][1005],visit[1005][1005];
int anss[1005][1005];
int n,m;
struct node
{
int x,y;
}road[1000000];
int ne[4][2]={0,1,0,-1,1,0,-1,0};
int check(node t)
{
if(t.x<1||t.x>n||t.y<1||t.y>m||book[t.x][t.y])
return 1;
return 0;
}
int bfs(node beginn)
{
int ans=0;
node re,pe;
int i,j=0;
book[beginn.x][beginn.y]=1;
queue<node>q;
q.push(beginn);
while(!q.empty())
{
re=q.front();
road[j++]=re;
visit[re.x][re.y]=1;
q.pop();
for(i=0;i<4;i++)
{
pe=re;
pe.x+=ne[i][0];
pe.y+=ne[i][1];
if(mapp[pe.x][pe.y]=='*')
{
ans++;
continue;
}
if(check(pe))
continue;
book[pe.x][pe.y]=1;
q.push(pe);
}
}
for(i=0;i<j;i++)
anss[road[i].x][road[i].y]=ans;
// printf("haha%d %d %d\n",beginn.x,beginn.y,ans);
return 0;
}
int main()
{
int k,i,x,y,j;
node beginn;
scanf("%d %d %d",&n,&m,&k);
for(i=1;i<=n;i++)
scanf("%s",mapp[i]+1);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(mapp[i][j]=='.'&&visit[i][j]==0)
{
beginn.x=i;
beginn.y=j;
bfs(beginn);
}
}
}
while(k--)
{
scanf("%d %d",&x,&y);
printf("%d\n",anss[x][y]);
}
return 0;
}
其实这两个题都不是很难,错就错在方法选择上,在代码实现之前,应好好想想选择的方法是否可行