思路: 循环每一格,判断是否上下左右都有为1的格子,如果满足,则变为2``` #include<bits/stdc++.h> using namespace std; #define FO(i,a,b) for(int i=a;i<=b;i++) int n,a[31][31],nx[31],nn[31],sx[31],sn[31]; bool ok(int a,int b){return a>=sn[b]&&a<=sx[b]&&b>=nn[a]&&b<=nx[a];} int main(){ memset(nn,0x3f,sizeof(nn)); memset(sn,0x3f,sizeof(sn)); cin>>n; FO(i,1,n){ FO(j,1,n){ cin>>a[i][j]; if(a[i][j]==0)continue; nx[i]=max(nx[i],j); sx[j]=max(sx[j],i); nn[i]=min(nn[i],j); sn[j]=min(sn[j],i); } } // FO(i,1,n){ // cout<<nn[i]<<" "<<nx[i]<<"\n"; // } // cout<<"\n"; // FO(i,1,n){ // cout<<sn[i]<<" "<<sx[i]<<"\n"; // } FO(i,1,n){ FO(j,1,n){ if(a[i][j]==0&&ok(i,j)==1)a[i][j]=2; cout<<a[i][j]<<" "; } cout<<"\n"; } return 0; }