2.1.1 The Castle

   写了几天的程序。麻烦啊,这条题目,要求找出的东西很多,房间数,最大房间,推墙后最大房间,推到那个墙,一开始构图啊,搞死我了,开了结构体什么的,搞了许久发现搞不出啊,就想啊想,看到了这里是2进制,后来就之间输入了数字先,后面再进行4面墙的判断,上网看到是并查集和bfs,就写了起来,发现写起来很麻烦,并且wa,后来一决心把程序删掉重新写了一条,不用并查集,用了种子填补法,标记每个房不同的标记,最后遍历图来统计,开个v数组开保存不同标记的大小,表示那个房间的大小。

  重写后感觉顺畅多了,写起来除了小漏洞一气呵成。提交上去拿了个90分,一看错了一个,悲剧,查找了许多,发现v数组开太小了,我悲催,总之,细心非常重要啊,这里只要搞好了方向优先就好了,因为根本不知道推到哪个墙先才是正确了,弄了我许久的一个地方,直接百度去查找了,程序中我已经标记出来了。

View Code
  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<math.h>
  4 #include<stdlib.h>
  5 #define max(a,b) a>b?a:b
  6 #define min(a,b) a>b?b:a
  7 #define INF     0x3f3f3f3f
  8 #define Maxin 10000
  9 int fang[4][2]={{0,-1},{-1,0},{0,1},{1,0}};
 10 int map[100][100],v[100][100];
 11 int r[3000],rn=0;
 12 int n[100][100][5],nn;
 13 int i,j;
 14 int max,maxx,maxy,maxf=5;
 15 void transform(int p,int x,int y)
 16 {
 17   nn=0;
 18   while(p!=0)
 19   {
 20     n[x][y][nn++]=p%2;
 21     p/=2;
 22   }
 23 }
 24 
 25 int inmap(int x,int y)//判断点在图内
 26 {
 27    if(x<0||x>=i||y<0||y>=j)
 28        return 0;
 29    return 1;
 30 }
 31 
 32 int dfs(int x,int y,int c)//dfs遍历同一房间内的空间,并标记为c
 33 {
 34     int k;        
 35     v[x][y]=c;
 36     for(k=0;k<4;k++)
 37     {
 38         int i=x+fang[k][0];
 39         int j=y+fang[k][1];
 40         if(inmap(i,j)&&n[x][y][k]==0&&v[i][j]==0)//满足在图内,没围墙,并且没被访问过
 41             dfs(i,j,c);
 42     }
 43     return 0;
 44 }
 45 
 46 int check(int x,int y)//推墙的检测
 47 {
 48     int k;
 49     for(k=0;k<4;k++)
 50     {
 51         int i=x+fang[k][0];
 52         int j=y+fang[k][1];
 53         if(inmap(i,j)&&n[x][y][k]==1&&v[x][y]!=v[i][j])
 54         {
 55             if(r[v[x][y]]+r[v[i][j]]>max)
 56             {
 57                 maxx=x;
 58                 maxy=y;
 59                 max=r[v[x][y]]+r[v[i][j]];
 60                 maxf=k;
 61             }
 62         }
 63     }
 64     return 0;
 65 }
 66 
 67 int main()
 68 {
 69   int x,y,color=0;
 70   int x1,y1;
 71   int maxb=0;
 72   memset(v,0,sizeof(v));
 73   memset(r,0,sizeof(r));
 74   memset(n,0,sizeof(n));
 75      scanf("%d%d",&j,&i);
 76   for(x=0;x<i;x++)
 77       for(y=0;y<j;y++)
 78       {
 79           scanf("%d",&map[x][y]);
 80           transform(map[x][y],x,y);
 81       }
 82   for(x=0;x<i;x++)
 83       for(y=0;y<j;y++)//一个一个遍历去
 84           if(v[x][y]==0)
 85           {
 86             color++;
 87             dfs(x,y,color);
 88           }
 89   
 90   for(x1=0;x1<i;x1++)
 91   {
 92       for(y1=0;y1<j;y1++)
 93           r[v[x1][y1]]++;
 94   }
 95 
 96   for(x=1;x<=color;x++)
 97       if(maxb<r[x])
 98           maxb=r[x];
 99 
100     printf("%d\n",color);
101     printf("%d\n",maxb);
102 
103    for(y1=0;y1<j;y1++)
104    {
105       for(x1=i-1;x1>=0;x1--)//注意这里,这样找符合题目的要求
106         check(x1,y1);
107    }
108    printf("%d\n",max);
109    printf("%d %d ",maxx+1,maxy+1);
110    switch(maxf)
111    {
112      case  0:printf("W\n");break;
113      case  1:printf("N\n");break;
114      case  2:printf("E\n");break;
115      case  3:printf("S\n");break;
116    }
117         return 0;
118 }

 

 

posted on 2012-05-24 20:22  usp10  阅读(162)  评论(0编辑  收藏  举报

导航