hdu 4090 GemAnd Prince 【bfs+dfs】
这题很长,但是就是一个暴搜+减枝
减枝: 现在的最大值 在上剩下的各颜色的平方(假设其它相同颜色都是连在一起的),不加会 tle;
还要说的是,当相同颜色的块<=2时,是不需要接着dfs 的
View Code
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 6 int n,m,k,best; 7 int a[9][9],ge[7]; 8 9 void getbian() //get a 10 { 11 //shang->xia 12 int num,t,i,j; 13 /* for(i=1;i<=n;i++){ 14 for(j=1;j<=m;j++) 15 printf("%d ",a[i][j]); 16 printf("\n"); 17 } 18 printf("~~~~~\n");*/ 19 for(i=1;i<=m;i++){ 20 t=0; 21 for(j=n;j>0;j--){ 22 if(a[j][i]==0){ 23 while(a[j-t][i]==0 && j-t>0){ 24 t++; 25 } 26 a[j][i]=a[j-t][i]; 27 a[j-t][i]=0; 28 } 29 if(j-t<=0) 30 break; 31 } 32 } 33 //righ->left 34 t=0; 35 for(i=1;i<=m;i++){ 36 if(a[n][i]==0){ 37 while(a[n][i+t]==0 && i+t<=m) 38 t++; 39 if(i+t<=m){ 40 for(j=1;j<=n;j++){ 41 a[j][i]=a[j][i+t]; 42 a[j][i+t]=0; 43 } 44 } 45 if(i+t>=m) 46 break; 47 } 48 } 49 /* for(i=1;i<=n;i++){ 50 for(j=1;j<=m;j++) 51 printf("%d ",a[i][j]); 52 printf("\n"); 53 } 54 printf("\n");*/ 55 } 56 57 void dfs(int shu) 58 { 59 int vis[9][9]; 60 int now[9][9]; 61 int lx[80],ly[80],i,j,ii,jj; 62 best=max(shu,best); 63 memset(ge,0,sizeof(ge)); 64 for(i=1;i<=n;i++){ 65 for(j=1;j<=m;j++){ 66 ge[a[i][j]]++; 67 now[i][j]=a[i][j]; 68 } 69 } 70 int he=0; 71 for(i=1;i<=k;i++) he+=ge[i]*ge[i]; 72 if(shu+he<=best) 73 return ; 74 memset(vis,0,sizeof(vis)); 75 for(i=1;i<=n;i++){ 76 for(j=1;j<=m;j++){ 77 if(vis[i][j]!=0 || now[i][j]==0) 78 continue; 79 for(ii=1;ii<=n;ii++) 80 for(jj=1;jj<=m;jj++) 81 a[ii][jj]=now[ii][jj]; 82 int tail=1,wei=1,gg=a[i][j]; 83 lx[tail]=i;ly[tail]=j; 84 vis[i][j]=1; 85 a[i][j]=0; 86 int x,y,tx,ty,tt=1; 87 while(tail<=wei){ 88 x=lx[tail];y=ly[tail]; 89 for(ii=-1;ii<=1;ii++){ 90 for(jj=-1;jj<=1;jj++){ 91 tx=x+ii;ty=y+jj; 92 if(tx<1 || tx>n || ty<1 || ty>m) 93 continue; 94 if(a[tx][ty]==gg && vis[tx][ty]==0){ 95 tt++;wei++; 96 lx[wei]=tx; 97 ly[wei]=ty; 98 a[tx][ty]=0; 99 vis[tx][ty]=1; 100 } 101 } 102 } 103 tail++; 104 } 105 if(tt<=2) continue; 106 getbian(); 107 dfs(shu+tt*tt); 108 } 109 } 110 } 111 112 int main() 113 { 114 int i,j; 115 // freopen("test","r",stdin); 116 while(scanf("%d%d%d",&n,&m,&k)!=EOF) 117 { 118 for(i=1;i<=n;i++){ 119 for(j=1;j<=m;j++){ 120 scanf("%d",&a[i][j]); 121 } 122 } 123 best=0; 124 dfs(0); 125 printf("%d\n",best); 126 } 127 return 0; 128 }


浙公网安备 33010602011771号