paizaラーニングのレベルアップ問題集「Aランクレベルアップメニュー」からの出典です。
paiza.jp
C++による「Aランクレベルアップメニュー」問題集: 陣取りゲームと、それらの提出コードの解答例です。
僕が作成、提出したコードは、以下のとおりです。
・STEP: 1 1マスの陣取り
/* paizaラーニング: C++による「Aランクレベルアップメニュー」問題集: 陣取りゲーム STEP: 1 1マスの陣取り https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_camp_step1 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; int main(void){ int h,w; cin>>h>>w; int n1=0,n2=0; vector<vector<char>> s(h+2,vector<char>(w+2)); for(int i=1;i<=h;i++){ for(int j=1;j<=w;j++){ cin>>s[i][j]; if(s[i][j]=='*'){ n1=i; n2=j; } } } s[n1-1][n2]='*'; s[n1+1][n2]='*'; s[n1][n2-1]='*'; s[n1][n2+1]='*'; for(int i=1;i<=h;i++){ for(int j=1;j<=w;j++){ cout<<s[i][j]; } cout<<endl; } return 0; }
・STEP: 2 1マスの陣取り2
/* paizaラーニング: C++による「Aランクレベルアップメニュー」問題集: 陣取りゲーム STEP: 2 1マスの陣取り2 https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_camp_step2 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; int main(void){ int h,w; cin>>h>>w; int n1=0,n2=0; vector<vector<char>> s(h+2,vector<char>(w+2)); for(int i=1;i<=h;i++){ for(int j=1;j<=w;j++){ cin>>s[i][j]; if(s[i][j]=='*'){ n1=i; n2=j; } } } if(s[n1-1][n2]!='#'){s[n1-1][n2]='*';} if(s[n1+1][n2]!='#'){s[n1+1][n2]='*';} if(s[n1][n2-1]!='#'){s[n1][n2-1]='*';} if(s[n1][n2+1]!='#'){s[n1][n2+1]='*';} for(int i=1;i<=h;i++){ for(int j=1;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_camp_step3 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; int main(void){ int h,w; cin>>h>>w; bool tf=false; vector<string> s(h); for(int i=0;i<h;i++){ cin>>s[i]; } pair<int,int> p; queue<pair<int,int>> q; for(int i=0;i<h;i++){ for(int j=0;j<w;j++){ if(s[i][j]=='*'){ q.push({i,j}); tf=true; break; } } if(tf){ break; } } while(!(q.empty())){ p=q.front(); q.pop(); int y=p.first,x=p.second; for(int i=-1;i<=1;i+=2){ if(0<=y+i && y+i<h && s[y+i][x]=='.'){ s[y+i][x]='*'; q.push({y+i,x}); } if(0<=x+i && x+i<w && s[y][x+i]=='.'){ s[y][x+i]='*'; q.push({y,x+i}); } } } for(int i=0;i<h;i++){ cout<<s[i]<<endl; } return 0; }
・STEP: 4 陣取りの手間
/* paizaラーニング: C++による「Aランクレベルアップメニュー」問題集: 陣取りゲーム STEP: 4 陣取りの手間 https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_camp_step4 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; int main(void){ int h,w; cin>>h>>w; bool tf=false; vector<string> s(h); for(int i=0;i<h;i++){ cin>>s[i]; } tuple<int,int,int> t; queue<tuple<int,int,int>> q; for(int i=0;i<h;i++){ for(int j=0;j<w;j++){ if(s[i][j]=='*'){ q.emplace(i,j,0); s[i][j]='0'; tf=true; break; } } if(tf){ break; } } while(!(q.empty())){ t=q.front(); q.pop(); int y=get<0>(t),x=get<1>(t),n=get<2>(t); for(int i=-1;i<=1;i+=2){ if(0<=y+i && y+i<h && s[y+i][x]=='.'){ s[y+i][x]=n+49; q.push({y+i,x,n+1}); } if(0<=x+i && x+i<w && s[y][x+i]=='.'){ s[y][x+i]=n+49; q.push({y,x+i,n+1}); } } } for(int i=0;i<h;i++){ cout<<s[i]<<endl; } return 0; }
・STEP: 5 陣取りのターン数
/* paizaラーニング: C++による「Aランクレベルアップメニュー」問題集: 陣取りゲーム STEP: 5 陣取りのターン数 https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_camp_step5 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; int main(void){ int h,w,n,num=0; cin>>h>>w>>n; bool tf=false; vector<string> s(h); vector<long long> l(n+1); for(int i=0;i<h;i++){ cin>>s[i]; } for(int i=0;i<n;i++){ cin>>l[i]; } l[n]=1e9; sort(l.begin(),l.end()); tuple<int,int,int> t; queue<tuple<int,int,int>> q; for(int i=0;i<h;i++){ for(int j=0;j<w;j++){ if(s[i][j]=='*'){ q.emplace(i,j,0); if(l[num]==0){ s[i][j]='?'; }else{ s[i][j]='*'; } tf=true; break; } } if(tf){ break; } } while(!(q.empty())){ t=q.front(); q.pop(); int y=get<0>(t),x=get<1>(t),n=get<2>(t); if(l[num]<=n){ num++; } for(int i=-1;i<=1;i+=2){ if(0<=y+i && y+i<h && s[y+i][x]=='.'){ if(n+1==l[num]){ s[y+i][x]='?'; }else{ s[y+i][x]='*'; } q.emplace(y+i,x,n+1); } if(0<=x+i && x+i<w && s[y][x+i]=='.'){ if(n+1==l[num]){ s[y][x+i]='?'; }else{ s[y][x+i]='*'; } q.emplace(y,x+i,n+1); } } } for(int i=0;i<h;i++){ cout<<s[i]<<endl; } return 0; }
・FINAL問題: 陣取りゲーム
/* paizaラーニング: C++による「Aランクレベルアップメニュー」問題集: 陣取りゲーム FINAL問題: 陣取りゲーム https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_camp_boss 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; int main(void){ int h,w,cnt=0,Aadd=0,sum[2]={1,1}; string n; bool tf=true; cin>>h>>w>>n; if(n=="B"){ cnt++; Aadd++; } vector<string> s(h); tuple<int,int,int> t; vector<queue<tuple<int,int,int>>> AB(2); for(int i=0;i<h;i++){ cin>>s[i]; } for(int i=0;i<h;i++){ for(int j=0;j<w;j++){ if(s[i][j]=='A'){ AB[0].emplace(i,j,Aadd); s[i][j]='*'; }else if(s[i][j]=='B'){ AB[1].emplace(i,j,0); s[i][j]='*'; } } } while(!AB[0].empty() || !AB[1].empty()){ if(AB[cnt%2].empty()){ cnt++; tf=false; } t=AB[cnt%2].front(); int y=get<0>(t),x=get<1>(t),num=get<2>(t); if(cnt/2<num && tf){ cnt++; t=AB[cnt%2].front(); y=get<0>(t),x=get<1>(t),num=get<2>(t); } AB[cnt%2].pop(); for(int i=-1;i<=1;i+=2){ if(0<=y+i && y+i<h && s[y+i][x]=='.'){ s[y+i][x]='*'; sum[cnt%2]++; AB[cnt%2].emplace(y+i,x,num+1); } if(0<=x+i && x+i<h && s[y][x+i]=='.'){ s[y][x+i]='*'; sum[cnt%2]++; AB[cnt%2].emplace(y,x+i,num+1); } } } cout<<sum[0]<<" "<<sum[1]<<endl; if(sum[0]<sum[1]){ cout<<"B"<<endl; }else if(sum[0]==sum[1]){ cout<<"Draw"<<endl; }else{ cout<<"A"<<endl; } return 0; }
paizaラーニングのレベルアップ問題集については、ユーザー同士で解答を教え合ったり、コードを公開したりするのは自由としています。
また授業や研修、教材などにも利用できるそうです。