zoukankan      html  css  js  c++  java
  • 水果消除

    问题 D: 水果消除

    时间限制: 2 Sec  内存限制: 128 MB
    提交: 271  解决: 117
    [提交][状态][讨论版]

    题目描述

    “水果消除”是一款手机游戏,相信大家都玩过或玩过类似的游戏。

    下面是“水果消除”游戏的一种初始状态。

    消除的基本规则:如果有2个或2个以上的相同水果连在一起,则可以点选并消除。

    请问在某一种状态下,有几种可以点选并消除的选择方案。

    例如,对于上图所示的初始状态,将有6种点选并消除的选择方案。这6种方案依次如下图所示。

                      

       

                       

    输入

    先输入一个整数n,表示放水果的格子总数为n*n。n取3到1000之间的整数(含3和1000)。

    然后依次输入n*n个表示水果的数据,不同的水果用不同的数字表示,同一种水果用相同的数字表示。

    表示水果的数字编号从1开始,不超过100。

    输出

    在输入数据对应的初始状态下,有几种点选并消除的选择方案。

    输出方案数。

    样例输入

    6
    1 1 2 2 2 2
    1 3 2 1 1 2
    2 2 2 2 2 3
    3 2 3 3 1 1
    2 2 2 2 3 1
    2 3 2 3 2 2
    

    样例输出

    6
    
     1 #include <cstdio>
     2 using namespace std;
     3 
     4 const int maxn=1001;
     5 int a[maxn][maxn];
     6 int n;
     7 int ans=0,step=0;
     8 
     9 void dfs(int x,int y)
    10 {
    11     int now=a[x][y];
    12     a[x][y]=0;
    13     for(int i=-1;i<=1;i+=2)
    14     {
    15         int fx=x;
    16         int fy=y+i;
    17         if(fx>0&&fx<=n&&fy>0&&fy<=n&&a[fx][fy]!=0&&a[fx][fy]==now)
    18         {
    19             step++;
    20             dfs(fx,fy);
    21         }
    22     }
    23     for(int i=-1;i<=1;i+=2)
    24     {
    25         int fx=x+i;
    26         int fy=y;
    27         if(fx>0&&fx<=n&&fy>0&&fy<=n&&a[fx][fy]!=0&&a[fx][fy]==now)
    28         {
    29             step++;
    30             dfs(fx,fy);
    31         }
    32     }
    33 }
    34 
    35 int main()
    36 {
    37 
    38     scanf("%d",&n);
    39     for(int i=1;i<=n;i++)
    40         for(int j=1;j<=n;j++)
    41     {
    42         scanf("%d",&a[i][j]);
    43     }
    44     for(int i=1;i<=n;i++)
    45         for(int j=1;j<=n;j++)
    46     {
    47         if(a[i][j]!=0)
    48         {
    49             step=0;
    50             dfs(i,j);
    51             if(step!=0)
    52                 ans++;
    53         }
    54     }
    55     printf("%d
    ",ans);
    56     return 0;
    57 }
    View Code

    分析:用dfs进行遍历。一次遍历将点选能消除的水果的编号置为0,并用step+1记录消除的水果个数。当step等于0时不算能消除。然后以二维数组各个未遍历过的点为起点,能step不等于0的dfs遍历次数即为所求。

  • 相关阅读:
    洛谷P2522 [HAOI2011]Problem b(莫比乌斯反演)
    洛谷P3327 [SDOI2015]约数个数和(莫比乌斯反演)
    Informatica PowerCenter 常用转换组件一览表
    Informatica_(3)组件
    Informatica_(2)第一个例子
    Informatica_(1)安装
    InformaticaPowerCenter调用存储过程
    Informatica 9.5.1 安装配置
    Linux字符集的查看及修改
    Redis-3.2.9集群配置(redis cluster)
  • 原文地址:https://www.cnblogs.com/onlyli/p/6925105.html
Copyright © 2011-2022 走看看