#53241: CPP 2ms 72KB rank1 2025/09/03


king960129@gmail.com (吳瑞宸)

學校 : 新北市立新莊高級中學
編號 : 216021
來源 : [140.138.224.147]
最後登入時間 :
2025-10-02 02:07:19

思路:用while(flag)持續掃整個mp的n*m直到任何一次掃描沒掃出任何東西,先決定A格,再從A格的右方或下方尋找B格,過程中遇到-1(在前次掃描中被發現且使用)則跳過,若A!=B則break,且輸入次數繁多,可用getchar加速,以下code可將read()視為cin、write()視為cout。

#pragma GCC optimize("Ofast,unroll-loops,no-stack-protector,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma comment(linker, "/stack:200000000")

//以上加速用

#include<cstdio>

using namespace std;

inline int read(){
    int x=0;
    char c=0;
    while(c<'0' || c>'9'){
        c=getchar();
    }
    while(c>='0'&& c<='9'){
        x=x*10+(c-'0');
        c=getchar();
    }
    return x;
}
inline void write(int x){
    if(x>=10){write(x/10);}
    putchar(x%10+'0');
}

//以上read write 加速In Out用

signed main(){
    int n,m,Ans=0;;
    n=read();
    m=read();
    int mp[n][m];
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            mp[i][j]=read();
        }
    }

//以上輸入階段
    bool flag=true;
    while(flag){
        flag=false;//若此次掃瞄有發現相鄰數字則true
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(mp[i][j]==-1){continue;}//遭遇-1跳過
                if(i+1<n){
                    //putchar('i');
                    for(int k=i+1;k<n;k++){
                        if(mp[k][j]==-1){continue;}//遭遇-1跳過
                        else if(mp[k][j]!=mp[i][j]){break;}
                        else{
                            Ans+=mp[i][j];
                            mp[i][j]=-1;
                            mp[k][j]=-1;
                            flag=true;
                            break;
                        }
                        if(flag){break;}
                    }
                }
                if(j+1<m && !flag){
                    //putchar('j');
                    for(int k=j+1;k<m;k++){
                        if(mp[i][k]==-1){continue;}//遭遇-1跳過
                        else if(mp[i][k]!=mp[i][j]){break;}
                        else{
                            Ans+=mp[i][k];
                            mp[i][j]=-1;
                            mp[i][k]=-1;
                            flag=true;
                            break;
                        }
                        if(flag){break;}//若此A格已被使用則break;
                    }
                }
            }
        }
    }
    write(Ans);//輸出答案
    return 0;
}