zoukankan      html  css  js  c++  java
  • 海战

    【题目描述】

    在一个方形的盘上放置了固定数量和形状的船只,每只船却不能碰到其它的船。在这个题中,我们仅考虑船是方形的,所有的船只都是由图形组成的方形。编写程序求出该棋盘上放置的船只的总数。

    【输入描述】

    输入文件头一行由用空格隔开的两个整数R和C组成,1 <= R,C <= 1000,这两个数分别表示游戏棋盘的行数和列数。接下来的R行每行包含C个字符,每个字符可以为“#”,也为“.”,“#”表示船只的一部分,“.”表示水。

    【输出描述】

    输出一行解。如果船的位置放得正确(即棋盘上只存在相互之间不能接触的方形,如果两个“#”号上下相邻或左右相邻却分属两艘不同的船只,则称这两艘船相互接触了)。就输出一段话“There are S ships.”,S表示船只的数量。否则输出“Bad placement.”。

    【样例输入】

    6 8

    .....#.#

    ##.....#

    ##.....#

    .......#

    #......#

    #..#...#

    【样例输出】

    There are 5 ships.

    源代码:
    
    #include<iostream>
    using namespace std;
    int x[3]={1,-1,0},y[3]={0,0,1}; //偷懒,人呐,总得多动点脑子,注意搜索顺序!
    bool Flag[1001][1001]={0};
    char Map[1001][1001];
    int n,m,D,R,ans,sum;
    void Right(int X,int Y) //右扩。
    {
        R++;
        if (Map[X+1][Y]=='#')
          Right(X+1,Y); 
    }
    void Down(int X,int Y) //下扩。
    {
        D++;
        if (Map[X][Y+1]=='#')
          Down(X,Y+1);
    }
    void Search(int X,int Y) //查找连接在一起的合法格子。
    {
        sum++;
        Flag[X][Y]=true;
        for (int a=0;a<3;a++)
        {
            int t1,t2;
            t1=X+x[a];
            t2=Y+y[a];
            if (!Flag[t1][t2]&&t1>=1&&t1<=n&&t2>=1&&t2<=m&&Map[t1][t2]=='#')
              Search(t1,t2);
        }
    }
    int main() //搜索要灵活。
    {
        cin>>n>>m;
        for (int a=1;a<=n;a++)
          for (int b=1;b<=m;b++)
            cin>>Map[a][b]; //回车竟然是两个字符啊啊啊啊啊!
        for (int a=1;a<=n;a++)
          for (int b=1;b<=m;b++)
            if (!Flag[a][b]&&Map[a][b]=='#')
            {
                 ans++;
                 sum=D=R=0;
                 Right(a,b);
                 Down(a,b);
                 Search(a,b);
                 if (sum!=D*R) //是否为矩形。
                 {
                     cout<<"Bad placement.";
                     return 0;
                 }
            }
         cout<<"There are "<<ans<<" ships.";
         return 0;
    }
  • 相关阅读:
    WrapPanel虚拟化
    关于Windows执行cmd命令的坑之一
    C# .Net 获取当前电脑上的可移动磁盘
    关于WPF中资源字典的内存优化
    WPF获取ListBox、ListView之类列表的ScrollViewer实例
    C#事件与委托 yangan
    系统自动登录设置(适用所有操作系统) yangan
    Oracel小知识记录 yangan
    使用avaScript获取Url中的指定参数值 yangan
    Win7下破解ArcGIS 9.3方法 yangan
  • 原文地址:https://www.cnblogs.com/Ackermann/p/5737530.html
Copyright © 2011-2022 走看看