寝癖頭の解法

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

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_map_step1
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int main(void){
    int h,w,n;
    cin>>h>>w>>n;
    char s[h][w];
    for(int i=0;i<h;i++){
        for(int j=0;j<w;j++){
            cin>>s[i][j];
        }
    }
    vector<int> y(n),x(n);
    for(int i=0;i<n;i++){
        cin>>y[i]>>x[i];
        cout<<s[y[i]][x[i]]<<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_map_step2
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int main(void){
    int h,w,n;
    cin>>h>>w>>n;
    char s[h][w];
    for(int i=0;i<h;i++){
        for(int j=0;j<w;j++){
            cin>>s[i][j];
        }
    }
    vector<pair<int,int>> coordinate(n);
    for(int i=0;i<n;i++){
        cin>>coordinate[i].first>>coordinate[i].second;
        s[coordinate[i].first][coordinate[i].second]='#';
    }
    for(int i=0;i<h;i++){
        for(int j=0;j<w;j++){
            cout<<s[i][j];
        }
        cout<<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_map_step3
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int main(void){
    int h,w;
    cin>>h>>w;
    char c[h][w];
    for(int i=0;i<h;i++){
        for(int j=0;j<w;j++){
            cin>>c[i][j];
        }
    }
    for(int i=0;i<h;i++){
        for(int j=0;j<w;j++){
            if(j-1<0){
                if(c[i][j+1]=='#'){
                    cout<<i<<" "<<j<<endl;
                }
            }else if(j+1>=w){
                if(c[i][j-1]=='#'){
                    cout<<i<<" "<<j<<endl;
                }
            }else{
                if(c[i][j-1]=='#' && c[i][j+1]=='#'){
                    cout<<i<<" "<<j<<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_map_step4
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int main(void){
    int h,w;
    cin>>h>>w;
    char c[h][w];
    for(int i=0;i<h;i++){
        for(int j=0;j<w;j++){
            cin>>c[i][j];
        }
    }
    for(int i=0;i<h;i++){
        for(int j=0;j<w;j++){
            if(i-1<0){
                if(c[i+1][j]=='#'){
                    cout<<i<<" "<<j<<endl;
                }
            }else if(i+1>=h){
                if(c[i-1][j]=='#'){
                    cout<<i<<" "<<j<<endl;
                }
            }else{
                if(c[i-1][j]=='#' && c[i+1][j]=='#'){
                    cout<<i<<" "<<j<<endl;
                }
            }
        }
    }
    return 0;
}
・FINAL問題: マップの判定・縦横

paiza.jp

/*
paizaラーニング: C++による「Aランクレベルアップメニュー」問題集: マップの判定・縦横
マップの判定・縦横
https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_snake_map_boss
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int main(void){
    int h,w;
    cin>>h>>w;
    char c[h][w];
    for(int i=0;i<h;i++){
        for(int j=0;j<w;j++){
            cin>>c[i][j];
        }
    }
    vector<pair<int,int>> vertical,beside,ans;
    for(int i=0;i<h;i++){
        for(int j=0;j<w;j++){
            if(i-1<0){
                if(c[i+1][j]=='#'){
                    vertical.push_back({i,j});
                }
            }else if(i+1>=h){
                if(c[i-1][j]=='#'){
                    vertical.push_back({i,j});
                }
            }else{
                if(c[i-1][j]=='#' && c[i+1][j]=='#'){
                    vertical.push_back({i,j});
                }
            }
        }
    }
    for(int i=0;i<h;i++){
        for(int j=0;j<w;j++){
            if(j-1<0){
                if(c[i][j+1]=='#'){
                    beside.push_back({i,j});
                }
            }else if(j+1>=w){
                if(c[i][j-1]=='#'){
                    beside.push_back({i,j});
                }
            }else{
                if(c[i][j-1]=='#' && c[i][j+1]=='#'){
                    beside.push_back({i,j});
                }
            }
        }
    }
    set_intersection(vertical.begin(),vertical.end(),beside.begin(),beside.end(),back_inserter(ans));
    for(int i=0;i<(int)ans.size();i++){
        cout<<ans[i].first<<" ";
        cout<<ans[i].second<<endl;
    }
    return 0;
}

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