水果消除

问题 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\n",ans);
56     return 0;
57 }
View Code

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

posted @ 2017-05-31 17:15  只有你  阅读(477)  评论(0编辑  收藏  举报