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
  • 相关阅读:
    信息收集之DNS域名解析
    集合遍历利器 -- 迭代器模式 介绍 使用场景案例 优缺点及程序演示
    简单工厂的霸霸 -- 抽象工厂模式 介绍 使用场景案例 优缺点及程序演示
    可能是目前最易理解的手写promise
    chrome 开发者工具实用技巧
    gulp常用插件之modernizr使用
    koa-cors 跨域设置中间件
    在nodejs 中如何fs文件系统模块
    nodejs操作MongoDB数据库 MongoDB增、删、改、查
    vue动态渲染样式 class
  • 原文地址:https://www.cnblogs.com/sjymj/p/5737027.html
Copyright © 2011-2022 走看看