Time Limits: 1000 ms Memory Limits: 262144 KB Detailed Limits
1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 using namespace std; 5 int xx[4]={0,0,-1,1}; 6 int yy[4]={1,-1,0,0}; 7 int a[10][10],vis[10][10],e[6]; 8 int n,flag,d; 9 void color(int x,int y,int col) 10 { 11 vis[x][y]=1; 12 for(int i=0;i<4;i++) 13 { 14 int nx=x+xx[i],ny=y+yy[i]; 15 if(nx<1||nx>n||ny<1||ny>n||vis[nx][ny]==1) 16 continue; 17 vis[nx][ny]=2; 18 if(a[nx][ny]==col) 19 color(nx,ny,col); 20 } 21 } 22 int eva(int s) 23 { 24 int cnt=0; 25 memset(e,0,sizeof(e)); 26 for(int i=1;i<=n;i++) 27 for(int j=1;j<=n;j++) 28 if(vis[i][j]!=1&&!e[a[i][j]]) 29 e[a[i][j]]=1,cnt++; 30 return(cnt); 31 } 32 bool judge(int col) 33 { 34 int tmp=0; 35 for(int i=1;i<=n;i++) 36 for(int j=1;j<=n;j++) 37 if(a[i][j]==col&&vis[i][j]==2) 38 { 39 tmp++; 40 color(i,j,col); 41 } 42 return(tmp>0); 43 } 44 void search(int s) 45 { 46 int tmp=eva(s),t[10][10]; 47 if(tmp==0) 48 { 49 flag=1; 50 return; 51 }else if(tmp+s>d) 52 return; 53 for(int i=0;i<=5;i++) 54 { 55 memcpy(t,vis,sizeof(t)); 56 if(judge(i)) 57 search(s+1); 58 memcpy(vis,t,sizeof(vis)); 59 if(flag) 60 return; 61 } 62 } 63 int main() 64 { 65 while(scanf("%d",&n)!=EOF&&n) 66 { 67 flag=0;memset(vis,0,sizeof(vis)); 68 for(int i=1;i<=n;i++) 69 for(int j=1;j<=n;j++) 70 cin>>a[i][j]; 71 color(1,1,a[1][1]); 72 for(d=0;d>=0;d++) 73 { 74 search(0); 75 if(flag) 76 { 77 cout<<d<<endl; 78 break; 79 } 80 } 81 } 82 return 0; 83 }