• POJ 3316 Snakes on a Plane


    题意:

      给定一个有n*m的个网格的方块,蛇是由连续的网格组成的序列,并具有以下两个属性。

      1,组成蛇身的网格的值为1

      2,蛇的每个格点附近(北/东/西/南)有且仅有有两个格点是1(蛇头蛇尾除外)

    不能在蛇头和蛇尾增长的,能增长但会违反蛇的两个属性或碰到另一条蛇,称为最长蛇。求最长蛇的数量。

     

    分析:

    1,判断是否是蛇;

    2,,判断在首尾两端增长时是否会合法(用扫雷游戏的手法来做,即求出每个格点的四 周的1的数量)

     

    :一直不能清晰的复述题意是迟迟做不出的这题的主要原因

     

    View Code
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #define MAXN 205
    using namespace std;
    
    int c[MAXN][MAXN],step[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
    char s[MAXN][MAXN];
    bool isMax(int i,int j,int &k)
    {
        int t,ii,jj;
        s[i][j]='2';
        if(c[i][j]<2)
        {
            for(t=0;t<4;t++)
            {
                ii=i+step[t][0];
                jj=j+step[t][1];
                if(s[ii][jj]=='0'&&c[ii][jj]==1)
                    k++;
            }
        }
        for(t=0;t<4;t++)
        {
            ii=i+step[t][0];
            jj=j+step[t][1];
            if(s[ii][jj]=='1')
            {
                if(c[ii][jj]>2)
                    return false;
                return isMax(ii,jj,k);
            }
        }
        return true;
    }
    
    int main()
    {
        int n,m,i,j,k,no;
        for(;scanf("%d%d",&n,&m),n+m;)
        {
            memset(c,0,sizeof(c));
            for(i=0;i<=n+1;i++)
                s[i][0]='2',s[i][m+1]='\0';
            for(j=0;j<=m+1;j++)
                s[0][j]=s[n+1][j]='2';
            for(i=1;i<=n;i++)
                scanf("%s",s[i]+1);
            for(i=1;i<=n;i++)
                for(j=1;j<=m;j++)
                    for(k=0;k<4;k++)
                        if(s[i+step[k][0]][j+step[k][1]]=='1')
                            c[i][j]++;
            for(i=1,no=0;i<=n;i++)
                for(j=1;j<=m;j++)
                    if(s[i][j]=='1'&&c[i][j]<2)
                    {
                        k=0;
                        if(isMax(i,j,k)&&!k)
                            no++;
                    }
            printf("%d\n",no);
        }
        return 0;
    }

     

     

  • 相关阅读:
    8.移动和重命名文件
    7.复制文件和目录
    22.变基
    21.拉取&删除远程分支
    程序员必备课程——网络编程入门
    正则表达式——Java程序员懂你
    编程语言的基础——搞定JavaIO
    需加装饰——装饰模式
    结合提供者模式解析Jenkins源码国际化的实现
    算法族的集中管理——策略模式
  • 原文地址:https://www.cnblogs.com/xchaos/p/2564724.html
Copyright © 2020-2023  润新知