The Game of Life (队列+map)

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;
 }

猜你喜欢

转载自www.cnblogs.com/ydw--/p/11404016.html
今日推荐