hdu 4090 GemAnd Prince 【bfs+dfs】

hdu 4090 GemAnd Princs

这题很长,但是就是一个暴搜+减枝

减枝: 现在的最大值 在上剩下的各颜色的平方(假设其它相同颜色都是连在一起的),不加会  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 }

 

posted @ 2012-10-23 19:39  feng_linxu  Views(168)  Comments(0)    收藏  举报