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