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 }