有一个建筑物平面示意图,可分解为 m × n 个边长面积均相等的小块,成为“格” 
m<=100,n<=100  1  2  3 4  5  6  7  ……  m 
1                            
2                            
3                            
4                            
……                            
n                            
相邻格之间可能有墙, wall ( x , y )表示横坐标为 x 、纵坐标为 y 的格,其四个方向墙取值的加和:左面墙取值 1 ,上面墙取值 2 ,右面墙取值 4 ,下面墙取值 8 。 
举例: wall ( 1 , 1 )取值为 3 ,则说明上面和左面有墙,其它方向没有。所有的墙将建筑物分割为若干个互相不连通的区域,每个区域称为一个“房间”。
对于格,及 wall ( x , y )的描述,采用数据文件 input.txt 描述 


11 6 11 6 3 10 6 
7 9 6 13 5 15 5 
1 10 12 7 13 7 5 
13 11 10 8 10 12 13 
其中,第一行为 m ,第二行为 n ,第三行各个数据为 wall ( 1 , 1 )—— wall ( 1 , m )其他各行依此类推。
本关问题,请编写程序,具体要求如下:
    读取一个给定的 input.txt 文件,求解,拆掉哪面墙,可以使得合并的两个房间,获得最大面积。输出夹着该墙的两个格的横纵坐标(只需找到满足要求的一堵墙,各坐标之间使用空格分割,如拆掉( 1 , 1 )和( 1 , 2 )两个格中间的墙,则输出为 1 1 1 2 )。

解决方案 »

  1.   

    令wall ( x , y )=a+2b+4c+8d;d=wall ( x , y ) div 8;
    c=(wall ( x , y ) mod 8 ) div 4;
    b=(wall ( x , y ) mod 8 ) mod 4 div 2;
    a=1;求出系数a,b,c,d,若都不为0,则说明四面都有墙按题目的要求,应该判断a,b,c,d中0的个数最多的那个房间的墙可以得到最大面积,若b<>0,则应该拆除上面的墙,c<>0.....;d<>0.....按这个思想,程序逻辑应该比较清楚了
      

  2.   

    我自己想的方法:(c语言的解法~~)
    把第三行以后的数据导入一个二维数组中,由于没个数都可分解为WALL(X,Y)=1A+2B+2*2C+2*2*2D,则当A!=0时左面有墙,B!=0时上方向有墙,如此类推.
    然后累计连通的空格数,找到连通空格数相加后最多&&相邻的两个"房间",输出它们相邻的两个空格.但是现在的问题是如何找到连通空格数相加后最多&&相邻的两个"房间"??请各位大虾继续指教!!!
      

  3.   

    将每一格分四值,例如:上连通为:t,左连通为l,右连通为r,下连通为b,那么当考虑到Wall(x,y)时,那么就看F(x,y)的四面连通性,若上连通则t=1,否则t=0,假设现在Wall(x,y)为左上顶角,那么它有两个方向可走,r和b,当r为1时判断F(x,y+1).l=1,F(x,y+1).r=1,如此可求出F(x,y)的四向现有面积At,Al,Ar,Ab,上方有墙t=0,那么At=A(x,y,b),左边没有墙l=1,那么Al=0,At=Ab=0表示上下都没有墙,Al=Ar=0表示左右都没有墙。
      

  4.   

    unsigned(僵哥 可以再解释下吗??看不太明白.F(X,Y)代表什么??Ax怎样求??