寝癖頭の解法

小学生の目線から、勉強中の覚え書きを投稿、更新していきます。

paizaラーニング: C++による「Aランクレベルアップメニュー」問題集: 座標系での向きの変わる移動

paizaラーニングのレベルアップ問題集「Aランクレベルアップメニュー」からの出典です。
paiza.jp
C++による「Aランクレベルアップメニュー」問題集: 座標系での向きの変わる移動と、それらの提出コードの解答例です。

僕が作成、提出したコードは、以下のとおりです。

・STEP: 1 マップからの座標取得

paiza.jp

/*
paizaラーニング: C++による「Aランクレベルアップメニュー」問題集: 座標系での向きの変わる移動
STEP: 1 マップからの座標取得
https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_snake_move_step1
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int main(void){
    int h,w;
    cin>>h>>w;
    int y=0,x=0;
    char c[h][w];
    for(int i=0;i<h;i++){
        for(int j=0;j<w;j++){
            cin>>c[i][j];
            if(c[i][j]=='#'){
                y=i;
                x=j;
            }
        }
    }
    cout<<y<<" "<<x<<endl;
    return 0;
}
・STEP: 2 座標系での移動・方角

paiza.jp

/*
paizaラーニング: C++による「Aランクレベルアップメニュー」問題集: 座標系での向きの変わる移動
STEP: 2 座標系での移動・方角
https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_snake_move_step2
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int main(void){
    int y,x,n;
    cin>>y>>x>>n;
    for(int i=0;i<n;i++){
        char d;
        cin>>d;
        if(d=='N'){
            --y;
            cout<<y<<" "<<x<<endl;
        }else if(d=='S'){
            ++y;
            cout<<y<<" "<<x<<endl;
        }else if(d=='W'){
            --x;
            cout<<y<<" "<<x<<endl;
        }else{
            ++x;
            cout<<y<<" "<<x<<endl;
        }
    }
    return 0;
}
・STEP: 3 座標系での移動・向き

paiza.jp

/*
paizaラーニング: C++による「Aランクレベルアップメニュー」問題集: 座標系での向きの変わる移動
STEP: 3 座標系での移動・向き
https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_snake_move_step3
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int main(void){
    string s="";
    int y,x;
    string D,d;
    cin>>y>>x>>D>>d;
    s+=D;
    s+=d;
    if(s=="NL" || s=="SR"){
        cout<<y<<" "<<x-1<<endl;
    }else if(s=="NR" || s=="SL"){
        cout<<y<<" "<<x+1<<endl;
    }else if(s=="WL" || s=="ER"){
        cout<<y+1<<" "<<x<<endl;
    }else{
        cout<<y-1<<" "<<x<<endl;
    }
    return 0;
}
・STEP: 4 座標系での規則的な移動

paiza.jp

/*
paizaラーニング: C++による「Aランクレベルアップメニュー」問題集: 座標系での向きの変わる移動
STEP: 4 座標系での規則的な移動
https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_snake_move_step4
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int main(void){
    int x,y,n;
    cin>>x>>y>>n;
    int walk=0;
    int dep=3;
    int depwalk=0;
    int corner=1;
    char udlr='L';
    x+=1;
    y+=1;
    walk+=2;
    while(!(walk>=n)){
        if(depwalk==dep-1){
            if(udlr=='D'){
                udlr='L';
            }else if(udlr=='L'){
                udlr='U';
            }else if(udlr=='U'){
                udlr='R';
            }else{
                udlr='D';
            }
            depwalk=0;
            corner++;
        }
        if(corner==4){
            x+=1;
            udlr='D';
            dep+=2;
            corner=0;
            depwalk=0;
        }else{
            if(udlr=='R'){
                x+=1;
            }else if(udlr=='L'){
                x-=1;
            }else if(udlr=='U'){
                y-=1;
            }else{
                y+=1;
            }
        }
        walk+=1;
        depwalk+=1;
    }
    cout<<x<<" "<<y<<endl;
    return 0;
}
・FINAL問題: 座標系での向きの変わる移動

paiza.jp

/*
paizaラーニング: C++による「Aランクレベルアップメニュー」問題集: 座標系での向きの変わる移動
FINAL問題: 座標系での向きの変わる移動
https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_snake_move_boss
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int main(void){
    int x,y,n;
    cin>>x>>y>>n;
    char udlr='u';
    for(int i=0;i<n;i++){
        char d;
        cin>>d;
        if(udlr=='u'){
            if(d=='R'){
                x+=1;
                udlr='r';
            }else{
                x-=1;
                udlr='l';
            }
        }else if(udlr=='r'){
            if(d=='R'){
                y+=1;
                udlr='d';
            }else{
                y-=1;
                udlr='u';
            }
        }else if(udlr=='d'){
            if(d=='R'){
                x-=1;
                udlr='l';
            }else{
                x+=1;
                udlr='r';
            }
        }else{
            if(d=='R'){
                y-=1;
                udlr='u';
            }else{
                y+=1;
                udlr='d';
            }
        }
        cout<<x<<" "<<y<<endl;
    }
    return 0;
}

paizaラーニングのレベルアップ問題集については、ユーザー同士で解答を教え合ったり、コードを公開したりするのは自由としています。
また授業や研修、教材などにも利用できるそうです。