5 6 0 0 0 3 4 4 0 1 1 3 3 3 2 2 1 2 3 3 1 1 1 1 3 3 2 2 1 4 4 4
4Hint0 0 0 3 4 4 0 0 0 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 3 3 3 0 0 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 1 2 3 3 0 0 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 3 3 2 2 2 3 3 0 2 2 2 4 4 0 2 2 0 0 0 0 0 0 0 0 0 0 2 2 1 4 4 4 2 2 4 4 4 0 2 2 4 4 4 0 2 2 2 0 0 0 0 0 0 0 0 0
#include<iostream> #include<cstring> #include<queue> #include<cstdio> using namespace std; #define ll long long #define ERR puts("=======here========"); #define prt(k) cout<<#k"="<<k<<" " #include<algorithm> int n,m; int dx[]={-1,1,0,0}; int dy[]={0,0,1,-1}; bool ok(int x,int y) { return 0<=x&&x<n&&0<=y&&y<m; } struct MAZE { int a[6][6]; bool vis[6][6]; int color[6][6]; int cnt; int H() { int c[7]; memset(c,0,sizeof c); for(int i=0;i<n;i++) for(int j=0;j<m;j++) c[a[i][j]]=1; int t=0; for(int i=1;i<=4;i++) t+=c[i]; return t; } MAZE() { memset(vis,0,sizeof vis); memset(a,0,sizeof a); memset(color,0,sizeof color); } bool isgoal() { for(int i=0;i<n;i++) for(int j=0;j<m;j++) if(a[i][j]>0) return 0;return 1; } void dfs(int x,int y) { vis[x][y]=1; color[x][y]=cnt; for(int i=0;i<4;i++) { int xx=x+dx[i],yy=y+dy[i]; if(ok(xx,yy)&&a[xx][yy]==a[x][y]&&!vis[xx][yy]) dfs(xx,yy); } } int h() { memset(vis,0,sizeof vis); memset(color,0,sizeof color); cnt=0; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(a[i][j]>0&&!vis[i][j]) { ++cnt; dfs(i,j); } } } return cnt; } void in() { for(int i=0;i<n;i++) for(int j=0;j<m;j++) cin>>a[i][j]; } void out() { for(int i=0;i<n;i++){ for(int j=0;j<m;j++)printf("%d ",a[i][j]); putchar(10); } putchar(10); } void remove(int c) { for(int i=0;i<n;i++)for(int j=0;j<m;j++)if(color[i][j]==c)a[i][j]=0; } void eq(MAZE b) { for(int i=0;i<n;i++)for(int j=0;j<m;j++) a[i][j]=b.a[i][j]; } void adjust() { for(int j=0;j<m;j++) { for(int i=n-1;i>=0;i--) { if(a[i][j]==0) { int k; for( k=i-1;k>=0;k--) if(a[k][j]>0) break; if(k>=0) { a[i][j]=a[k][j]; a[k][j]=0; } } } } for(int j=0;j<m;j++) { if(a[n-1][j]==0) { for(int x=0;x<n;x++) { for(int y=j;y<m-1;y++) { a[x][y]=a[x][y+1]; a[x][y+1]=0; } } } } // out(); } }; MAZE maze; int limit; int dfs(int dep,MAZE u) { if(dep==limit) { return u.isgoal(); } bool vis[7][7]; int block=u.h(); // printf("H(u)=%d dep=%d limit=%d\n",u.H(),dep,limit); if(u.H()+dep>limit) return 0; // u.out(); for(int i=1;i<=block;i++) { MAZE v=u;; //v.eq(u); v.remove(i); v.adjust(); memset(v.color,0,sizeof v.color); if(dfs(dep+1,v)) return 1; } return 0; } int main() { while(cin>>n>>m) { maze.in(); limit=0; while(1) { if(dfs(0,maze)) break; limit++; if(limit>11) break; } printf("%d\n",limit); } } /** 3 3 1 3 1 1 2 1 1 2 1 */