zoukankan      html  css  js  c++  java
  • 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;
     }
  • 相关阅读:
    2. Add Two Numbers
    1. Two Sum
    22. Generate Parentheses (backTracking)
    21. Merge Two Sorted Lists
    20. Valid Parentheses (Stack)
    19. Remove Nth Node From End of List
    18. 4Sum (通用算法 nSum)
    17. Letter Combinations of a Phone Number (backtracking)
    LeetCode SQL: Combine Two Tables
    LeetCode SQL:Employees Earning More Than Their Managers
  • 原文地址:https://www.cnblogs.com/ydw--/p/11404016.html
Copyright © 2011-2022 走看看