zoukankan      html  css  js  c++  java
  • 洛谷 P1331 海战

    传送门

    题解:由于船是方形的,所以比较简单。但是考试的时候跪了,orz。忘了考虑类似一圈井号中间有一摊水。

             可以只考虑这个点上方和左边点的情况,这样分为四种情况。一种是左边是一滩水,上面是船,那么这个点与上面的点构成船。另一种正好相反。第三种是左边和上面都是水,那么它自己先构成船。第四种是左边和上面都是船,但是不是同一条船。这时船相邻。那么这样子考虑的话,一定会有不满足方形的船出现。因此在搜到一滩水的时候,判断它的上方和左边有没有船,如果都有船,且不是同一条,则有船相邻。

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #define N 1100 
    using namespace std;
    char a[N][N];
    int f[N][N]={0};
    int r,c,sum=0;
    int main()
    {
        scanf("%d%d",&r,&c);
        for (int i=1;i<=r;i++)
          for (int j=1;j<=c;j++)
            cin>>a[i][j];
        for (int i=1;i<=r;i++)
          for (int j=1;j<=c;j++)
             {
                 if (a[i][j]=='.') f[i][j]=0;
                 if (a[i][j]=='#')
                   {
                      int x=f[i-1][j],y=f[i][j-1];
                         if (x!=0&&y!=0&&x!=y) 
                         {
                               cout<<"Bad placement."<<endl;
                                return 0;
                         }
                       else if (x==0&&y!=0) f[i][j]=y;
                       else if (x!=0&&y==0) f[i][j]=x;
                       else if (x==0&&y==0) f[i][j]=++sum;
                   } 
             
             }
        printf("There are %d ships.
    ",sum);
        return 0;
                      
    }
    蠢蛋的60分代码
    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #define N 1100 
    using namespace std;
    char a[N][N];
    int f[N][N]={0};
    int r,c,sum=0;
    int main()
    {
        scanf("%d%d",&r,&c);
        for (int i=1;i<=r;i++)
          for (int j=1;j<=c;j++)
            cin>>a[i][j];
        for (int i=1;i<=r;i++)
          for (int j=1;j<=c;j++)
             {
                int x=f[i-1][j],y=f[i][j-1];
                 if (a[i][j]=='.')
                   {
                         if (x==y&&x!=0) 
                           {
                                cout<<"Bad placement."<<endl;
                                return 0;
                           }              
                         f[i][j]=0;
                   }       
                 if (a[i][j]=='#')
                   {
                      
                         if (x!=0&&y!=0&&x!=y) 
                         {
                                cout<<"Bad placement."<<endl;
                                return 0;
                         }
                       else if (x==0&&y!=0) f[i][j]=y;
                       else if (x!=0&&y==0) f[i][j]=x;
                       else if (x==0&&y==0) f[i][j]=++sum;
                       else if (x==y) f[i][j]=x;
                   } 
             
             }
        printf("There are %d ships.
    ",sum);
        return 0;
                      
    }
    改后满分代码
    I'm so lost but not afraid ,I've been broken and raise again
  • 相关阅读:
    [computer graphics]世界坐标系->相机坐标系详细推导
    [Computer Vision]霍夫变换直线检测
    [OpenGL](翻译+补充)投影矩阵的推导
    [WebGL]二维变换
    [WebGL]Shader中的数据和简单的工作流
    图像梯度
    皮肤镜图片毛发去除
    胸部CT提取分割肺部
    医学影像重采样
    ES7学习笔记(十二)高亮 和 搜索建议
  • 原文地址:https://www.cnblogs.com/sjymj/p/5737027.html
Copyright © 2011-2022 走看看