zoukankan      html  css  js  c++  java
  • AC Again hdoj 1582 搜索

    AC Again

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 306    Accepted Submission(s): 84

    Description

    “AC”这个单词大概是我们 ACMers 最希望听到的回答了。不过如果把它写下来,你还能认识吗?
    现在给你一幅由点阵构成的图,它代表 'A' 或 'C' 的一个字母。你的任务就是把它们识别出来。

    注意:
    1.笔划可能有粗有细,但是我们保证字符在外形上是肉眼可辨别的。
    2.我们保证笔划是连贯的,即对于任意一个有笔划的点,在它周围八个点内有一点有笔划,这两点就是相连贯的。
    3.'A','C'这两个字符可能会按90,180,270这样的角度旋转。
     

    Input

    本题目包含多组测试,每两组测试之间用一个或多个空行隔开。
    对于每组数据,系统将给你一个肉眼可以辨别的图形表示一个字符'A' 或 'C'。
    系统保证每个图形的大小在 50 * 50 一下。
    输入数据只包含 ' '(空格)和'*'两种字符,其中'*'表示该点有笔划。
     

    Output

    对于每组数据,根据图形,在一行内输出 A 或 C。
     

    Sample Input

      *
     * *
    *****
    *   *
     
    ******
    *
    *
    * ******
     

    Sample Output

    A
    C
    做题的关键在于,不知道如何来结束输入,结束之后又不知道如何来判断是哪个之母;
    我们可以观察一下,A字母中间是空的,而C不是,其实这就是一个差别啊,所以我们可以从这入手来解决这类问题;
    用搜索的方法,来进行判断;
     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 using namespace std;
     5 char s[55][55];
     6 void bfs(int x,int y)
     7 {
     8     if(x<=50 && y<=50 && x>=0 && y>=0 && s[x][y]=='#')
     9     {
    10         s[x][y]='*';//遇见#的话就开始进行深度搜索;
    11         bfs(x+1,y);//同时把#变成*;
    12         bfs(x-1,y);//但是A内部的没有变成*,依然是#,所以在下面用flag进行判断
    13         bfs(x,y+1);
    14         bfs(x,y-1);
    15     }
    16 }
    17 int main()
    18 {
    19     int i,j,n,flag;
    20     int k=0;
    21     memset(s,'#',sizeof(s));
    22     while(gets(s[1]+1))
    23     {
    24         if(s[1][1]=='') continue;//判断结束输入;
    25         k=2;
    26         while( gets(s[k]+1) && (s[k++][1] != ''));
    27         for(i=0;i<51;i++)
    28             for(j=0;j<51;j++)
    29              if(s[i][j]!='*')//如果不是*则赋值成#;
    30                 s[i][j]='#';
    31         bfs(0,0);//开始调用
    32         flag =0;
    33         for(i=1;i<=50 && !flag;i++)
    34         {
    35             for(j=1;j<=50;j++)
    36             {
    37                 if(s[i][j]=='#')//如果到最后,依然存在#,则s是A
    38                 {
    39                     flag =1;break;
    40                 }
    41         }
    42     }
    43     if(flag)cout<<"A
    ";
    44     else cout<<"C
    ";
    45     memset(s,'#',sizeof(s));
    46  }
    47 return 0;
    48 }


     

  • 相关阅读:
    ACM/ICPC ZOJ1006-Do the Untwist 解题代码
    ACM/ICPC ZOJ1003-Crashing Balloon 解题代码
    数据结构(二)二叉搜索树-非递归实现遍历
    数据结构(一)二叉搜索树-递归实现
    Spark系列(三)SparkContext分析
    Docker系列(九)Kubernetes安装
    Docker系列(八)Kubernetes介绍
    Docker系列(七)Shipyard安装及介绍
    Docker系列(六)路由打通网络示例
    Esper系列(十四)Contained-Event Selection
  • 原文地址:https://www.cnblogs.com/lovychen/p/3317947.html
Copyright © 2011-2022 走看看