1. 程式人生 > >水果消除

水果消除

請問 esp display 整數 個數 cnblogs ret 問題 例如

問題 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遍歷次數即為所求。

水果消除