1. 程式人生 > 其它 >天天愛消除

天天愛消除

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define M 7
 4 int ans;
 5 int rx[]={0,1,0,-1};
 6 int ry[]={1,0,-1,0};
 7 bool check(int n,int m,int mp[M][M]){
 8     for(int i=0;i<n;i++)
 9         for(int j=0;j<m;j++)
10             if(mp[i][j])return false;
11     return true;
12 }
13 void
color(int x,int y,int n,int m,int c,int mp[M][M]){ 14 mp[x][y]=0; 15 for(int i=0;i<4;i++){ 16 int x1=x+rx[i]; 17 int y1=y+ry[i]; 18 if(x1>=0&&x1<n&&y1>=0&&y1<m&&mp[x1][y1]==c){ 19 color(x1,y1,n,m,c,mp); 20 }
21 } 22 } 23 void copy(int A[M][M],int B[M][M],int n,int m){ 24 for(int i=0;i<n;i++) 25 for(int j=0;j<m;j++) 26 A[i][j]=B[i][j]; 27 } 28 void Down(int mp[M][M],int n,int m){ 29 for(int j=0;j<m;j++){ 30 int k=n-1,i; 31 for(int i=n-1;i>=0;i--) 32
if(mp[i][j])mp[k--][j]=mp[i][j]; 33 for(;k>=0;k--) 34 mp[k][j]=0; 35 } 36 } 37 int Left(int mp[M][M],int n,int m){ 38 int cnt[10]={0},A[10],k=0; 39 for(int j=0;j<m;j++) 40 for(int i=0;i<n;i++)cnt[j]+=mp[i][j]; 41 for(int j=0;j<m;j++) 42 if(cnt[j])A[k++]=j; 43 for(int j=0;j<m;j++){ 44 for(int i=0;i<n;i++) 45 if(j<k)mp[i][j]=mp[i][A[j]]; 46 else mp[i][j]=0; 47 } 48 return k; 49 } 50 int H(int mp[M][M],int n,int m){ 51 int A[5]={0}; 52 for(int i=0;i<n;i++) 53 for(int j=0;j<m;j++) 54 A[mp[i][j]]++; 55 int cnt=0; 56 for(int i=1;i<=4;i++) 57 if(A[i])cnt++; 58 return cnt; 59 } 60 void dfs(int n,int m,int mp[M][M],int cnt){ 61 if(cnt+H(mp,n,m)>ans)return; 62 if(m==0){ 63 if(cnt<ans)ans=cnt; 64 return; 65 } 66 int i,j,mark[M][M],nxt[M][M]; 67 copy(mark,mp,n,m); 68 for(i=0;i<n;i++){ 69 for(j=0;j<m;j++){ 70 if(mark[i][j]!=0){ 71 color(i,j,n,m,mark[i][j],mark); 72 copy(nxt,mp,n,m); 73 color(i,j,n,m,nxt[i][j],nxt); 74 Down(nxt,n,m); 75 int m1=Left(nxt,n,m); 76 dfs(n,m1,nxt,cnt+1); 77 } 78 } 79 } 80 } 81 int main(){ 82 int mp[M][M]; 83 int n,m,i,j; 84 while(scanf("%d %d",&n,&m)!=EOF){ 85 for(i=0;i<n;i++) 86 for(j=0;j<m;j++) 87 scanf("%d",&mp[i][j]); 88 ans=40; 89 m=Left(mp,n,m); 90 dfs(n,m,mp,0); 91 printf("%d\n",ans); 92 } 93 return 0; 94 }

有款方塊消除的遊戲。現在請你破解它。。

這個遊戲最多隻有4種不同的方塊。如果點選一個方塊,那麼它與跟它連通的相同顏色的方塊就會同時消失掉。

當方塊消失時,那些在它上面的方塊,就會掉落下來。如果某列方塊都消失了,那麼它右邊的方塊都會整體移動過來。

現在請你算算,最少用多少步,就可以把所有的方塊都消除掉。