paizaラーニングのレベルアップ問題集「Aランクレベルアップメニュー」からの出典です。
paiza.jp
C++による「Aランクレベルアップメニュー」問題集: マップの判定・縦横と、それらの提出コードの解答例です。
僕が作成、提出したコードは、以下のとおりです。
・STEP: 1 盤面の情報取得
/* 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ラーニング: 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ラーニング: 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ラーニング: 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ラーニング: 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ラーニングのレベルアップ問題集については、ユーザー同士で解答を教え合ったり、コードを公開したりするのは自由としています。
また授業や研修、教材などにも利用できるそうです。