寝癖頭の解法

学習中の覚え書きを投稿、更新していきます。

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_mapmove_step1
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int main(void){
    int h,w;
    cin>>h>>w;
    int sy,sx;
    cin>>sy>>sx;
    char m;
    cin>>m;
    char s[h][w];
    for(int i=0;i<h;i++){
        for(int j=0;j<w;j++){
            cin>>s[i][j];
        }
    }
    if(m=='N'){
        sy--;
    }else if(m=='S'){
        sy++;
    }else if(m=='E'){
        sx++;
    }else{
        sy--;
    }
    if(s[sy][sx]=='\0' || s[sy][sx]=='#'){
        cout<<"No"<<endl;
    }else{
        cout<<"Yes"<<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_mapmove_step2
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int main(void){
    string s="";
    int h,w;
    cin>>h>>w;
    int sy,sx;
    cin>>sy>>sx;
    string d,m;
    cin>>d>>m;
    s+=d;
    s+=m;
    char c[h][w];
    for(int i=0;i<h;i++){
        for(int j=0;j<w;j++){
            cin>>c[i][j];
        }
    }
    if(s=="NL" || s=="SR"){
        sx-=1;
    }else if(s=="NR" || s=="SL"){
        sx+=1;
    }else if(s=="WL" || s=="ER"){
        sy+=1;
    }else{
        sy-=1;
    }
    if(c[sx][sy]=='.'){
        cout<<"Yes"<<endl;
    }else{
        cout<<"No"<<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_mapmove_step3
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int sy,sx;
char c[30][30];
string s="N ";
bool judge(void){
    if(s=="NL" || s=="SR"){
        sx-=1;
        s[0]='W';
    }else if(s=="NR" || s=="SL"){
        sx+=1;
        s[0]='E';
    }else if(s=="WL" || s=="ER"){
        sy+=1;
        s[0]='S';
    }else{
        sy-=1;
        s[0]='N';
    }
    if(c[sy][sx]=='.'){
        return true;
    }else{
        return false;
    }
}
int main(void){
    int h,w,n;
    cin>>h>>w>>sy>>sx>>n;
    for(int i=0;i<h;i++){
        for(int j=0;j<w;j++){
            cin>>c[i][j];
        }
    }
    char d[n];
    for(int i=0;i<n;i++){
        cin>>d[i];
        s[1]=d[i];
        if(!judge()){
            cout<<"Stop"<<endl;
            return 0;
        }
        cout<<sy<<" "<<sx<<endl;
    }
}
・STEP: 4 移動が可能かの判定・幅のある移動

paiza.jp

/*
paizaラーニング: C++による「Aランクレベルアップメニュー」問題集: へび
STEP: 4 移動が可能かの判定・幅のある移動
https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_snake_mapmove_step4
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
char s[4]={'N','E','S','W'};
int cnt=0;
int x,y,h,w;
bool tf=false;
void move(char d,char m,int l,vector<string> vs){
    int lr=1,add=1,lx=x,ly=y;
    if(m=='L'){
        lr=-1;
        add=3;
    }
    for(int i=0;i<l;i++){
        if(d=='N'){
            x+=lr;
        }else if(d=='S'){
            x-=lr;
        }else if(d=='E'){
            y+=lr;
        }else{
            y-=lr;
        }
        if(!(0<=x && x<w && 0<=y && y<h && vs[y][x]!='#')){
            cout<<ly<<" "<<lx<<endl;
            tf=true;
            break;
        }
        lx=x;
        ly=y;
    }
    cnt+=add;
}
int main(void){
    int n;
    cin>>h>>w>>y>>x>>n;
    vector<string> vs(h);
    for(int i=0;i<h;i++){
        cin>>vs[i];
    }
    for(int i=0;i<n;i++){
        char m;
        int l;
        cin>>m>>l;
        move(s[cnt%4],m,l,vs);
        if(tf){
            cout<<"Stop"<<endl;
            break;
        }else{
            cout<<y<<" "<<x<<endl;
        }
    }
    return 0;
}
・STEP: 5 幅のある移動

paiza.jp

/*
paizaラーニング: C++による「Aランクレベルアップメニュー」問題集: へび
STEP: 5 幅のある移動
https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_snake_mapmove_step5
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
char s[4]={'N','E','S','W'};
int cnt=0,x,y,h,w;
bool tf=false;
void move(char d,char m,int l,vector<string>& vs){
    int lr=1,add=1;
    vs[y][x]='*';
    if(m=='L'){
        lr=-1;
        add=3;
    }
    for(int i=0;i<l;i++){
        if(d=='N'){
            x+=lr;
        }else if(d=='S'){
            x-=lr;
        }else if(d=='E'){
            y+=lr;
        }else{
            y-=lr;
        }
        if(!(0<=x && x<w && 0<=y && y<h && vs[y][x]!='#')){
            tf=true;
            break;
        }
        vs[y][x]='*';
    }
    cnt+=add;
}
int main(void){
    int n;
    cin>>h>>w>>y>>x>>n;
    vector<string> vs(h);
    for(int i=0;i<h;i++){
        cin>>vs[i];
    }
    for(int i=0;i<n;i++){
        char m;
        int l;
        cin>>m>>l;
        move(s[cnt%4],m,l,vs);
        if(tf){
            break;
        }
    }
    for(int i=0;i<h;i++){
        cout<<vs[i]<<endl;
    }
    return 0;
}
・STEP: 6 時刻に伴う移動

paiza.jp

/*
paizaラーニング: C++による「Aランクレベルアップメニュー」問題集: へび
STEP: 6 時刻に伴う移動
https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_snake_mapmove_step6
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
char s[4]={'N','E','S','W'};
int cnt=0,sx,sy,h,w;
void move(char d,char m){
    int lr=1,add=1;
    if(m=='S'){
        if(d=='N'){
            sy--;
        }else if(d=='S'){
            sy++;
        }else if(d=='E'){
            sx++;
        }else{
            sx--;
        }
    }else{
        if(m=='L'){
            lr=-1;
            add=3;
        }
        if(d=='N'){
            sx+=lr;
        }else if(d=='S'){
            sx-=lr;
        }else if(d=='E'){
            sy+=lr;
        }else{
            sy-=lr;
        }
        cnt+=add;
    }
}
int main(void){
    int n,cnt2=0;
    cin>>h>>w>>sy>>sx>>n;
    vector<string> vs(h);
    vector<pair<int,char>> pic(n);
    for(int i=0;i<h;i++){
        cin>>vs[i];
    }
    for(int i=0;i<n;i++){
        cin>>pic[i].first>>pic[i].second;
    }
    for(int i=0;i<100;i++){
        if(i==pic[cnt2].first){
            move(s[cnt%4],pic[cnt2].second);
            cnt2++;
        }else{
            move(s[cnt%4],'S');
        }
        if((0<=sx && sx<w) && (0<=sy && sy<h) && vs[sy][sx]!='#'){
            cout<<sy<<" "<<sx<<endl;
        }else{
            cout<<"Stop"<<endl;
            break;
        }
    }
    return 0;
}
・FINAL問題: へび

paiza.jp

/*
paizaラーニング: C++による「Aランクレベルアップメニュー」問題集: へび
FINAL問題: へび
https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_snake_mapmove_boss
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
char s[4]={'N','E','S','W'};
int cnt=0,sx,sy,h,w;
void move(char d,char m){
    int lr=1,add=1;
    if(m=='S'){
        if(d=='N'){
            sy--;
        }else if(d=='S'){
            sy++;
        }else if(d=='E'){
            sx++;
        }else{
            sx--;
        }
    }else{
        if(m=='L'){
            lr=-1;
            add=3;
        }
        if(d=='N'){
            sx+=lr;
        }else if(d=='S'){
            sx-=lr;
        }else if(d=='E'){
            sy+=lr;
        }else{
            sy-=lr;
        }
        cnt+=add;
    }
}
int main(void){
    int n,cnt2=0;
    cin>>h>>w>>sy>>sx>>n;
    vector<string> vs(h);
    vector<pair<int,char>> pic(n);
    for(int i=0;i<h;i++){
        cin>>vs[i];
    }
    vs[sy][sx]='*';
    for(int i=0;i<n;i++){
        cin>>pic[i].first>>pic[i].second;
    }
    for(int i=0;i<100;i++){
        if(i==pic[cnt2].first){
            move(s[cnt%4],pic[cnt2].second);
            cnt2++;
        }else{
            move(s[cnt%4],'S');
        }
        if((0<=sx && sx<w) && (0<=sy && sy<h) && vs[sy][sx]!='#' && vs[sy][sx]!='*'){
            vs[sy][sx]='*';
        }else{
            break;
        }
    }
    for(int i=0;i<h;i++){
        cout<<vs[i]<<endl;
    }
    return 0;
}

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