https://nanti.jisuanke.com/t/A1537
我之前写的时候还用了set 一直超时 去掉就好了
#include<bits/stdc++.h> using namespace std; char mp[1005][1005]; int fx[8]={0,1,0,-1,1,1,-1,-1}; int fy[8]={1,0,-1,0,1,-1,-1,1}; int a[600]; int k1; struct node { int x1,y1; }qu[10005]; int check(int ans) { int i,j; map<int,int>m; vector<int>ve; for(i=0;i<k1;i++)//活的放队列 每次取出来 他旁边的位置标记+1 { node q=qu[i]; ve.push_back(q.x1*10000+q.y1);//另外 注意这个,另存一下每个点 就是第27行代码 for(j=0;j<8;j++) { int xxx=q.x1+fx[j],yyy=q.y1+fy[j]; m[xxx*10000+yyy]++; } } for(i=0;i<ve.size();i++) { int c=ve[i]; if(m[c]==0)m[c]=1;//如果他旁边都没有活的,也把他放到map里 为了剪去它(记为1 因为如果它旁边只有一个活的他也还是会死) } k1=0; map<int,int >::iterator it; for(it=m.begin();it!=m.end();it++) { int f=it->first,s=it->second; int xxx=f/10000,yyy=f%10000; if(mp[xxx][yyy]=='#') { if(s<2||s>3)mp[xxx][yyy]='.',ans--; else if(s>=2&&s<=3)qu[k1].x1=xxx,qu[k1++].y1=yyy; } else { if(s==3) { mp[xxx][yyy]='#',ans++; qu[k1].x1=xxx,qu[k1++].y1=yyy; } } } return ans; } int main() { int i,j,t; scanf("%d",&t); while(t--) { int n,m; memset(a,0,sizeof(a)); scanf("%d%d",&n,&m); getchar(); k1=0; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { scanf("%c",&mp[i+500][j+500]); if(mp[i+500][j+500]=='#')a[0]++,qu[k1].x1=i+500,qu[k1++].y1=j+500; } getchar(); } int minn=a[0],mi=0; for(int k=1;k<=321;k++) { a[k]=check(a[k-1]); if(a[k]>minn) { minn=a[k],mi=k; } } for(i=0;i<k1;i++) { node q=qu[i]; if(mp[q.x1][q.y1]=='#')mp[q.x1][q.y1]='.';//初始化 } cout<<mi<<" "<<minn<<" "<<a[321]<<endl; } return 0; }