洛谷 P1331海战

 P1331 海战 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路

这一题就是在寻找有多少个色块(在这一题指的就是船)的基础之上,加了一个前提条件,色块必须得是方块型的,因为题目规定了每只船却不能碰到其它的船,棋盘上只存在相互之间不能接触的方形。所以每次找到一个色块之后,得去判断这个色块是不是方块型的。我每次找色块的时候,用一个一维数组记录色块每行的长度,然后完整的找到一个色块之后,再去比较它每行的长度是否相等,如果不相等,就直接判断船只放置的不正确,否则就成功找到一条船。

代码实现

#include<bits/stdc++.h>
using namespace std;
char s[1005][1005];
int r,c,vis1[1005][1005],vis2[1005],sum,cnt;
int d[4][4]={{0,1},{1,0},{0,-1},{-1,0}};
void dfs(int u,int v)//找船只
{
    if(u<0||u>=r||v<0||v>=c)
    {
        return;
    }
    vis1[u][v]=1;//标记该点已经成为了某一条船的一部分
    vis2[u]++;//通过记录某条船每行的长度,方便判断某条船是否方块状的
    for(int i=0;i<4;i++)
    {
        int uu=u+d[i][0];
        int vv=v+d[i][1];
        if(uu>=0&&uu<r&&vv>=0&&vv<c&&vis1[uu][vv]==0&&s[uu][vv]=='#')
        {
            dfs(uu,vv);
        }
    }
}
int main()
{
    scanf("%d %d",&r,&c);
    for(int i=0;i<r;i++)
    {
        scanf("%s",s[i]);
    }
    for(int i=0;i<r;i++)
    {
        for(int j=0;j<c;j++)
        {
            if(vis1[i][j]==0&&s[i][j]=='#')
            {
                dfs(i,j);
                sum++;
                int flag=0;
                for(int k=0;k<r;k++)
                {
                    if(vis2[k]>0&&flag==0)//找出该条船每行的长度
                    {
                        cnt=vis2[k];
                        flag=1;
                    }
                    if(vis2[k]>0&&flag==1)
                    {
                        if(vis2[k]!=cnt)//每行的长度不相同,直接输出Bad placement
                        {
                            printf("Bad placement.");
                            return 0;
                        }
                        vis2[k]=0;//去除标记,方便下一条船的寻找
                    }
                }
                cnt=0;//去除标记
            }
        }
    }
    printf("There are %d ships.",sum);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值