思路:用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;
}