1. 程式人生 > >牛客練習賽12 A 圓圓 . B 迷宮

牛客練習賽12 A 圓圓 . B 迷宮

main cstring mar mem pre 所有 ble ios math

題目描述
我們定義一個圓 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 迷宮