BOJ407 Blocks

给定一个 NM 的矩阵,求问里面有多少个由'#'组成的矩形,"There are 5 ships.",若是里面有一个不是矩形的联通块,则输出"So Sad"

输入格式

1n,m1000

有多组数据,EOF结束。

输出格式

每行对应一个answer

输入样例

6 8
.....#.#
##.....#
##.....#
.......#
#......#
#..#...#
6 8
.....#.#
##.....#
###...##
.......#
##.....#
#..#...#
简单搜索题,但是刚开始的时候超时了,貌似是judge问题··········据说DFS会超时,但是优化之后能过。BFS时间要快一些,具体办法是保存每个矩形左上角的点的坐标,并在图上标记出右下角的坐标位置,对周围没有‘#’的‘#’不保存,直接计入矩阵数。然后对每一个左上角的点向左,向下BFS,如果BFS出的形状不为矩形则返回-1.复杂度为O(n*m)。可以做些小优化,比如计算左上角的点和右下角的点的数量,如果两者不相等,则不用BFS,直接输出“So Sad”;用双重for循环代替BFS,对于某个左上角的点,向右走到头,记录下矩阵的长,然后遍历下面每一排的点,直到遇到‘.’,如果停下的点不是先前所标记的,则返回-1。这样的话大概能优化常数倍时间
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
typedef long long LL;
typedef pair<int,int> P;
char A[1100][1100];
bool used[1100][1100];
bool ispoint[1100][1100];
P V[100000];
P point[100000];
int N,M,si,sp;
int solve()
{
    int i,j,k,res=0;
    queue<int> que;
    for(i=0;i<si;i++){
        for(j=V[i].second;j<M;j++){
            if(A[V[i].first][j]!='#')break;
        }
        int n=j;
        for(j=V[i].first+1;j<N;j++){
            if(A[j][V[i].second]!='#')break;
            for(k=V[i].second+1;k<n;k++){
                if(A[j][k]!='#'){
                return -1;
                }
            }
        }
        if(ispoint[j-1][n-1]==true) res++;
        else return -1;
    }
    return res;
}
int main()
{
    int i,j,k;
    while(scanf("%d%d",&N,&M)!=EOF){
        for(i=0;i<N;i++){
            scanf("%s",A[i]);
        }
        si=0;
        memset(used,0,sizeof(used));
        memset(ispoint,0,sizeof(ispoint));
        sp=0;
        int sum=0;
        for(i=0;i<N;i++){
            for(j=0;j<M;j++){
                if(A[i][j]=='#'&&(i==0||A[i-1][j]!='#')&&(j==0||A[i][j-1]!='#')){
                    if((i==N-1||A[i+1][j]!='#')&&(j==M-1||A[i][j+1]!='#'))sum++;
                    else{
                       V[si].first=i;
                       V[si++].second=j;
                    }
                }
                else if(A[i][j]=='#'&&(i==N-1||A[i+1][j]!='#')&&(j==M-1||A[i][j+1]!='#')){
                    sp++;
                    ispoint[i][j]=true;
                }
            }
        }
      /*  for(i=0;i<si;i++){
            printf("left up:%d %d\n",V[i].first,V[i].second);
        }
        for(i=0;i<N;i++){
            for(j=0;j<M;j++)
            if(ispoint[i][j])
            printf("right low:%d %d\n",i,j);
        }*/
        int ans;
        if(sp!=si) printf("So Sad\n");
        else{ ans=solve();
        if(ans!=-1)printf("There are %d ships.\n",ans+sum);
        else printf("So Sad\n");
        }
    }
    return 0;
}

利用 TensorFlow 训练自己的目标识别器。本文内容来自于我的毕业设计,基于 TensorFlow 1.15.0,其他 TensorFlow 版本运行可能存在问题。.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值