寝癖頭の解法

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

paizaラーニング: C++による「Aランクレベルアップメニュー」問題集: 陣取りゲーム

paizaラーニングのレベルアップ問題集「Aランクレベルアップメニュー」からの出典です。
paiza.jp
C++による「Aランクレベルアップメニュー」問題集: 陣取りゲームと、それらの提出コードの解答例です。

僕が作成、提出したコードは、以下のとおりです。

・STEP: 1 1マスの陣取り

paiza.jp

/*
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.jp

/*
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.jp

/*
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.jp

/*
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.jp

/*
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.jp

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