#37561: 有人可以幫忙看哪裡錯嗎謝謝


10955033 (unknown)

學校 : 臺北市立忠孝國民中學
編號 : 188713
來源 : [163.21.114.203]
最後登入時間 :
2024-05-02 16:56:47
j123. 2. 運貨站 -- 2022年10月APCS | From: [36.231.1.76] | 發表日期 : 2023-09-16 23:42

#include <bits/stdc++.h>

using namespace std;

int main()
{   ios::sync_with_stdio(false);
    int b,c,n;
    cin >> b >> c >>n;
    int  s[31][51]={0};
    int t=0,p=0;//t為剩餘 p為丟棄
    while(n--){
        char q ;
        int z;
        cin >> q >> z;//z為差距(高度)
        // b 為高度  c 為寬度
        if(q=='A'){
            if(b-z<4) {p++; continue;} // 檢查高度
            int k=0;
            for(int i=0;i<c&&k==0;i++){
                 //找到當排為0的
                 if(s[z][i]==0&&s[z+1][i]==0&&s[z+2][i]==0&&s[z+3][i]==0) {
                            s[z][i]=1;
                            for(int j=i;j>=0;j--){
                               if(s[z][j]==0)  s[z][j]=2;
                            }
                            s[z+1][i]=1;
                            for(int j=i;j>=0;j--){
                               if(s[z+1][j]==0)  s[z+1][j]=2;
                            }
                            s[z+2][i]=1;
                            for(int j=i;j>=0;j--){
                               if(s[z+2][j]==0)  s[z+2][j]=2;
                            }
                            s[z+3][i]=1;
                            for(int j=i;j>=0;j--){
                               if(s[z+3][j]==0)  s[z+3][j]=2;
                            }
                            k=1;
                 }
            }

        }

        else if(q=='C'){
             if(b-z<2) {p++; continue;} // 檢查高度
            int k=0;
            for(int i=0;i<c&&k==0;i++){
                 //找到當排為0的
                if(i==c-1){p++;break;}//檢查寬度
                else if(s[z][i]==0&&s[z][i+1]==0&&s[z+1][i]==0&&s[z+1][i+1]==0) {
                            s[z][i]=1;
                            for(int j=i;j>=0;j--){
                               if(s[z][j]==0)  s[z][j]=2;
                            }
                            s[z+1][i]=1;
                            for(int j=i;j>=0;j--){
                               if(s[z+1][j]==0)  s[z+1][j]=2;
                            }
                            s[z][i+1]=1;
                            s[z+1][i+1]=1;
                            k=1;
                }
            }

        }
        else if(q=='B'){
            int k=0;
            for(int i=0;i<c&&k==0;i++){
                 //找到當排為0的
                if(i==c-2){p++;break;}//檢查寬度
                else if(s[z][i]==0&&s[z][i+1]==0&&s[z][i+2]==0) {
                            //cout << "&&"<< z <<" "<<i << endl;
                            s[z][i]=1;
                            s[z][i+1]=1;
                            s[z][i+2]=1;
                            k=1;
                    }

            }

        }
        else if(q=='D'){
            if(b-z<2) {p++; continue;} // 檢查高度
            int k=0;
            for(int i=0;i<c&&k==0;i++){
                 //找到當排為0的
                 if(s[z][i]==0&&s[z+1][i]==0&&s[z+1][i-1]==0&&s[z+1][i-2]==0) {
                            s[z][i]=1;
                            for(int j=i;j>=0;j--){
                               if(s[z][j]==0)  s[z][j]=2;
                            }
                            s[z+1][i]=1;
                            s[z+1][i-1]=1;
                            s[z+1][i-2]=1;
                            for(int j=i-2;j>=0;j--){
                               if(s[z+1][j]==0)  s[z+1][j]=2;
                            }
                            k=1;
                    }
                   else if(i==c-1) p++;

            }
        }
        else if(q=='E'){
            if(b-z<3) {p++; continue;} // 檢查高度
            int k=0;
            for(int i=0;i<c&&k==0;i++){
                 //找到當排為0的
                if(s[z][i]==0&&s[z+1][i]==0&&s[z+1][i-1]==0&&s[z+2][i]==0&&s[z+2][i-1]==0) {
                            s[z][i]=1;
                            for(int j=i;j>=0;j--){
                               if(s[z][j]==0)  s[z][j]=2;
                            }
                            s[z+1][i]=1;
                            s[z+1][i-1]=1;
                            for(int j=i-1;j>=0;j--){
                               if(s[z+1][j]==0)  s[z+1][j]=2;
                            }
                            s[z+2][i]=1;
                            s[z+2][i-1]=1;
                            for(int j=i-1;j>=0;j--){
                               if(s[z+2][j]==0)  s[z+2][j]=2;
                            }
                            k=1;
                    }
               else if(i==c-1) p++;
            }
        }

       /* for(int i=0;i<b;i++){
    for(int j=0;j<c;j++){
        cout << s[i][j] << " ";
        }
        cout << endl;
}cout << p << endl;

    }*/
    for(int i=0;i<b;i++){
            for(int j=0;j<c;j++){
                if(s[i][j]==0||s[i][j]==2) t++;
            }
        }
    cout << t << " " << p << endl;

     return 0;
}

我的想法是把已擋住的地方設為2,使積木不能進去

 
#37620: Re: 有人可以幫忙看哪裡錯嗎謝謝


cges30901 (cges30901)

學校 : 不指定學校
編號 : 30877
來源 : [101.136.203.77]
最後登入時間 :
2024-04-07 15:34:14
j123. 2. 運貨站 -- 2022年10月APCS | From: [27.247.231.193] | 發表日期 : 2023-09-20 12:59

形狀D和E放的位置怪怪的

 
ZeroJudge Forum