“水果消除”是一款手机游戏,相信大家都玩过或玩过类似的游戏。
下面是“水果消除”游戏的一种初始状态。
消除的基本规则:如果有2个或2个以上的相同水果连在一起,则可以点选并消除。
请问在某一种状态下,有几种可以点选并消除的选择方案。
例如,对于上图所示的初始状态,将有6种点选并消除的选择方案。这6种方案依次如下图所示。
标签:open ++ turn dfs 选择 记录 分享 isp 维数
“水果消除”是一款手机游戏,相信大家都玩过或玩过类似的游戏。
下面是“水果消除”游戏的一种初始状态。
消除的基本规则:如果有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 }
分析:用dfs进行遍历。一次遍历将点选能消除的水果的编号置为0,并用step+1记录消除的水果个数。当step等于0时不算能消除。然后以二维数组各个未遍历过的点为起点,能step不等于0的dfs遍历次数即为所求。
标签:open ++ turn dfs 选择 记录 分享 isp 维数
原文地址:http://www.cnblogs.com/onlyli/p/6925105.html