I did something like this a while back, but I had both rectangular and triangular shapes. Figuring out the boundaries in an efficient manner was a challenge. It was far enough back that I don't remember it all, though, so that doesn't help much. The key to remember is that memory is cheap. Keeping lists of what bounds what, which room is accessible from the others, or any other arrangement that makes sense is fine, even if it means multiple options.

One other suggestion is that, since everything is a rectangle, you don't need to change the size of any control. Instead, every control has a bounds, which is a rectangle. Suppose you have a room that has the left,top of (120,150). To figure out what is to the east of that, you could take a point that is (left - 15, top + 15) That would be a point that is to the left of the room. The Rectangle structure has a method that returns true if a point is within it. So, you could check whether any controls contain that point, if so, then they bound the room in question on that side. For a room that was 30 wide and 60 high, the points would be (left-15,top+15) and (left-15, top+45) for rooms on the left, (left+15,top-15) for rooms above, (left+15, top+height+15) for rooms below, and (left+width+15,top+15) and (left+weidth+15,top+45) for rooms on the right. Given any room and any size, so long as all sides are multiples of 30, the points that need to be checked can be calculated pretty easily from the control in question.