海战
海战
题目描述
在峰会期间,武装部队得处于高度戒备。警察将监视每一条大街,军队将保卫建筑物,领空将布满了F-2003飞机。此外,巡洋船只和舰队将被派去保护海岸线。不幸的是因为种种原因,国防海军部仅有很少的几位军官能指挥大型海战。因此,他们考虑培养一些新的海军指挥官,他们选择了“海战”游戏来帮助学习。
在这个著名的游戏中,在一个方形的盘上放置了固定数量和形状的船只,每只船却不能碰到其它的船。在这个题中,我们仅考虑船是方形的,所有的船只都是由图形组成的方形。编写程序求出该棋盘上放置的船只的总数。
在这个著名的游戏中,在一个方形的盘上放置了固定数量和形状的船只,每只船却不能碰到其它的船。在这个题中,我们仅考虑船是方形的,所有的船只都是由图形组成的方形。编写程序求出该棋盘上放置的船只的总数。
输入
第一行由用空格隔开的两个整数R和C组成,1<=R,C<=1000,这两个数分别表示游戏棋盘的行数和列数。接下来的R行每行包含C个字符,每个字符可以为“#”,也可为“.”,“#”表示船只的一部分,“.”表示水。
输出
为每一个段落输出一行解。如果船的位置放得正确(即棋盘上只存在相互之间不能接触的方形,如果两个“#”号上下相邻或左右相邻却分属两艘不同的船只,则称这两艘船相互接触了)。就输出一段话“There are S ships.”,S表示船只的数量。否则输出“Bad placement.”。
样例输入
6 8
.....#.#
##.....#
##.....#
.......#
#......#
#..#...#
样例输出
There are 5 ships.
分析:dfs时保留延展的最大横坐标和纵坐标,然后看实际面积与这个最大矩形面积是否相同即可;
代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <climits> #include <cstring> #include <string> #include <set> #include <map> #include <queue> #include <stack> #include <vector> #include <list> #define rep(i,m,n) for(i=m;i<=n;i++) #define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++) #define mod 1000000007 #define inf 0x3f3f3f3f #define vi vector<int> #define pb push_back #define mp make_pair #define fi first #define se second #define ll long long #define pi acos(-1.0) const int maxn=1e3+10; const int dis[4][2]={{0,1},{-1,0},{0,-1},{1,0}}; using namespace std; ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);} ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p;p=p*p;q>>=1;}return f;} int n,m,k,t,vis[maxn][maxn],tx,ty,num,ans; char a[maxn][maxn]; void dfs(int x,int y) { vis[x][y]=1; tx=max(tx,x); ty=max(ty,y); num++; for(int i=0;i<4;i++) { int l=x+dis[i][0],r=y+dis[i][1]; if(l>=0&&l<n&&r>=0&&r<m&&!vis[l][r]&&a[l][r]=='#') dfs(l,r); } } int main() { int i,j; scanf("%d%d",&n,&m); rep(i,0,n-1)scanf("%s",a[i]); rep(i,0,n-1)rep(j,0,m-1) { if(!vis[i][j]&&a[i][j]=='#') { tx=ty=num=0; dfs(i,j); if((ty-j+1)*(tx-i+1)==num)ans++; else return 0*puts("Bad placement."); } } printf("There are %d ships.\n",ans); //system("pause"); return 0; }