天天爱消除

 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种不同的方块。如果点击一个方块,那么它与跟它连通的相同颜色的方块就会同时消失掉。

当方块消失时,那些在它上面的方块,就会掉落下来。如果某列方块都消失了,那么它右边的方块都会整体移动过来。

现在请你算算,最少用多少步,就可以把所有的方块都消除掉。

posted @ 2021-10-06 15:41  木窗  阅读(72)  评论(0)    收藏  举报