#35012: C++題解


sungwayne99999@gmail.com (pekka)

學校 : 不指定學校
編號 : 229876
來源 : [49.216.162.220]
最後登入時間 :
2023-05-02 14:54:25
g276. 2. 魔王迷宮 -- 2021年9月APCS | From: [49.216.162.220] | 發表日期 : 2023-05-02 15:15

第一次寫解題報告 請多指教>_<

每次移動分解成 留下炸彈 -> 魔王移動 -> 引爆炸彈

前兩部在一個moveMan() 裡完成 移動時順便紀錄當前剩餘人數 剩下0人時結束

最後一步要分成 先殺掉站在炸彈上的人 隨後清理掉那些炸彈 不然不能一次炸死炸彈上所有魔王 在litBomber()裡完成

之後不斷循環直到沒有人 數剩下炸彈數輸出 

ps 其實完全可以一個main()裡面寫完 不過還是比較習慣每個步驟寫到函式裡面.. 反正能AC就好

 

程式碼

/*
    #include <iostream>
    #include <vector>
    using std::vector;

    struct man{ //應該要大寫才對 忘記改
        int y;
        int x;
        int dy;
        int dx;
        bool onGrid; //是否在場
    };
    vector<vector<int>> bomber;
    vector<man> vman;

    bool inRange(int y,int x){
        return bomber.size()-1>=y && y>=0 && bomber[0].size()-1>=x && x>=0;
    }

    int moveMan(){
        int manCount=0;
        for(auto &man:vman){ //記得要&!!
            if(man.onGrid==1){
                manCount+=1;
                bomber[man.y][man.x]=1;
                man.y+=man.dy;
                man.x+=man.dx;
                man.onGrid=inRange(man.y,man.x);
            }
        }
        return manCount;
    }
    void litBomber(){
        for(auto &man:vman){
            if(man.onGrid==1){
                if(bomber[man.y][man.x]!=0){
                    man.onGrid=0;
                    bomber[man.y][man.x]=-1;// 0=無炸彈 1=有炸彈 -1=上面有人 準備被引爆
                }
            }
        }
        for(int i=0;i<=bomber.size()-1;i++){ // 引爆炸彈
            for(int j=0;j<=bomber[0].size()-1;j++){
                if(bomber[i][j]==-1){
                    bomber[i][j]=0;
                }
            }
        }
    }
    int countBomber(){
        int bomberCount=0;
        for(int i=0;i<=bomber.size()-1;i++){
            for(int j=0;j<=bomber[0].size()-1;j++){
                if(bomber[i][j]==1){
                    bomberCount+=1;
                }
            }
        }
        return bomberCount;
    }
    void conduct(){
        int runTime=0;int manCount;
        while(runTime<100){runTime++;
            manCount=moveMan();
            if(manCount==0){break;}
            litBomber();
        }
    }
    int main(){
        int n,m,k;std::cin>>n>>m>>k;
        bomber=vector<vector<int>> (n,vector<int> (m,0));
        int r_,c_,s_,t_;
        for(int i=1;i<=k;i++){
            std::cin>>r_>>c_>>s_>>t_;
            vman.push_back({r_,c_,s_,t_,1});
        }

        conduct();
        std::cout<<countBomber();
    }
*/
 
ZeroJudge Forum