牛客練習賽12 A 圓圓 . B 迷宮
題目描述
我們定義一個圓 C 為以原點 (0, 0) 為中心的單位圓(半徑為 1 的圓)。給定在 C 圓周上相異的兩點
A, B。請問由 A 出發,沿著圓周走到 B,是順時針走比較近,還是逆時針走比較近呢?
C 的圓周上的所有點都可以用 (cos(t), sin(t)) 來表示,其中 t 的物理意義為角度。也就是說,在圓 C 中,給定一角度 t 即可確定在圓周上的一點。在這題中,所有的角度皆以弧度制表示,另外,由於不同的t 值有機會對應到同一個圓周上的點,我們限制t 的範圍為[-π,π )。
本題中,我們會用tA 以及tB 來代表點A 及點B,數學上,A = (cos(tA), sin(tA)), B = (cos( tB), sin(tB))。
輸入描述:
輸入的第一行有一個正整數T,代表接下來共有幾組測試數據。
接下來的T行,每行有兩個浮點數tA, tB,代表一組數據。
輸出描述:
對於每組數據請輸出一行,如順時針比較近請輸出“clockwise”,否則請輸出“counterclockwise”。
示例1
輸入
3
3.14 3.13
-3.14 -3.13
1.00 2.00
輸出
clockwise
counterclockwise
counterclockwise
備註:
1≤T≤105
?π≤tA,tB<π
A≠B
輸入中的浮點數精確至小數點下兩位
題意
題解
水~
#include<iostream> #include<algorithm> #include<cmath> #include<cstdio> using namespace std; const int maxn=2e5+5; const double PI=3.141592625; int main() { ios::sync_with_stdio(false); int t; cin>>t; while(t--) { double a,b; cin>>a>>b; if(a<0) a+=2*PI; if(b<0) b+=2*PI; if(b>a) if(fabs(b-a)>PI) cout<<"clockwise"<<endl; else cout<<"counterclockwise"<<endl; else if(fabs(b-a)<PI) cout<<"clockwise"<<endl; else cout<<"counterclockwise"<<endl; } return 0; }
時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 262144K,其他語言524288K
64bit IO Format: %lld
題目描述
這是一個關於二維迷宮的題目。我們要從迷宮的起點 ‘S‘ 走到終點 ‘E‘,每一步我們只能選擇上下左右四個方向中的一個前進一格。 ‘W‘ 代表墻壁,是不能進入的位置,除了墻壁以外的地方都可以走。迷宮內的 ‘D‘ 代表一道上鎖的門,只有在持有鑰匙的時候才能進入。而 ‘K‘ 則代表了鑰匙,只要進入這一格,就會自動地拿到鑰匙。最後 ‘.‘ 則是代表空無一物的地方,歡迎自在的遊蕩。
本題的迷宮中,起點、終點、門跟鑰匙這四個特殊物件,每一個恰好會出現一次。而且,此迷宮的四周 (最上面的一行、最下面的一行、最左邊的一列以及最右邊的一列) 都會是墻壁。
請問,從起點到終點,最少要走幾步呢?
輸入描述:
輸入的第一行有兩個正整數H, W,分別代表迷宮的長跟寬。
接下來的H行代表迷宮,每行有一個長度恰為W的字串,此字串只包含‘S‘
, ‘E‘
, ‘W‘
, ‘D ‘
, ‘K‘
, ‘.‘
這幾種字元。
輸出描述:
請在一行中輸出一個整數代表答案,如果無法從起點走到終點,請輸出-1。
示例1
輸入
4 12
WWWWWWWWWWWW
WE.W.S..W.KW
W..D..W....W
WWWWWWWWWWWW
輸出
20
示例2
輸入
6 6
WWWWWW
WEWS.W
W.WK.W
W.WD.W
W.W..W
WWWWWW
輸出
-1
備註:
4 ≤ H, W≤ 500
‘S‘, ‘E‘, ‘K‘, ‘D‘各出現恰好一次
迷宮的四周(最上面的一行、最下面的一行、最左邊的一列以及最右邊的一列) 都會是 ‘W‘
題意
題解
兩種路徑:可以從起點到終點,二是拿到鑰匙過門到終點,可以跑一下從起點到key點,再從key點到終點。取二者最小值(有幾種情況需要考慮)
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int maxn=500+5;
const double PI=3.141592625;
char maze[maxn][maxn];
int dx[]={1,-1,0,0},dy[]={0,0,1,-1};
int ex,ey;
bool vis[maxn][maxn];
int n,m;
struct node
{
int x,y;
int step;
};
int bfs(int sx,int sy,int gx,int gy)
{
memset(vis,false,sizeof(vis));
queue<node> que;
node cur;
cur.x=sx,cur.y=sy;
cur.step=0;
que.push(cur);
vis[sx][sy]=true;
while(!que.empty())
{
cur=que.front();
que.pop();
if(cur.x==gx&&cur.y==gy)
return cur.step;
node next=cur;
for(int i=0;i<4;i++)
{
next.x=cur.x+dx[i],next.y=cur.y+dy[i];
if(0<next.x&&next.x<n&&0<next.y&&next.y<m&&!vis[next.x][next.y]&&maze[next.x][next.y]!='W')
{
vis[next.x][next.y]=true;
next.step=cur.step+1;
que.push(next);
}
}
}
return -1;
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
int ex,ey,dx,dy,sx,sy,kx,ky;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
cin>>maze[i][j];
if(maze[i][j]=='S')
sx=i,sy=j;
if(maze[i][j]=='E')
ex=i,ey=j;
if(maze[i][j]=='D')
dx=i,dy=j;
if(maze[i][j]=='K')
kx=i,ky=j;
}
maze[dx][dy]='W';
int ans1=bfs(sx,sy,ex,ey);
int ans2=bfs(sx,sy,kx,ky);
int ans3=-1;
if(ans2!=-1)
{
maze[dx][dy]='.';
ans3=bfs(kx,ky,ex,ey);
}
if(ans1==-1&&ans2==-1)
cout<<"-1"<<endl;
else if(ans1==-1)
{
if(ans3==-1)
cout<<"-1"<<endl;
else
cout<<ans2+ans3<<endl;
}
else if(ans2==-1)
cout<<ans1<<endl;
else
cout<<min(ans1,ans2+ans3)<<endl;
return 0;
}
牛客練習賽12 A 圓圓 . B 迷宮