BOJ407 Blocks
来源:互联网 发布:mac怎么清理qq缓存 编辑:程序博客网 时间:2024/06/17 23:48
给定一个
输入格式
有多组数据,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;}
0 0
- BOJ407 Blocks
- boj407.BLOCKS-bfs
- blocks
- Blocks
- Blocks
- Blocks
- Blocks
- Blocks
- Blocks
- Blocks
- 15.2 Blocks
- Delimiting Blocks
- Code::Blocks
- Code::Blocks
- poj2363-blocks
- blocks学习
- blocks 学习
- Code::Blocks
- The iostream library
- Spring--Quartz 任务调度的配置详解
- Opengl 来给三角形一点颜色看看
- ckeditor使用
- js prototype原型面向对象编程详解
- BOJ407 Blocks
- Linux 下C语言简单实现线程池
- Linux下的Nginx安装(开机自启动)
- 队列实现 队列的链式结构实现
- 博弈论最小最大算法minmax
- 实现浏览器全屏(兼容各种浏览器)
- 发送短信
- 【Linux学习】Linux系统管理2—作业调度
- 排序算法之归并排序