洛谷 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.\n",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.\n",sum);
    return 0;
                  
}
改后满分代码

 

转载于:https://www.cnblogs.com/sjymj/p/5737027.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值