海战

海战

题目描述

在峰会期间,武装部队得处于高度戒备。警察将监视每一条大街,军队将保卫建筑物,领空将布满了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;
}

 

 
posted @ 2016-08-16 09:56  mxzf0213  阅读(206)  评论(0编辑  收藏  举报