某著名IT公司的一道压轴笔试题
你玩过CS实战吗?小Y是个CS实战游戏设计者。最近他刚买了个破房子,房子的地图表示为N*M(1<=N<=M <=50)个单元格,他需要改造这个破房子作为他的CS实战战场。地图里只有3样东西:墙、门和钥匙,墙或门围起来可以构成封闭的房间。这个破房子至少有2个房间,房间里至少有一堵墙或门。为了更好地改造这个战场地图,他想要得到这地图的一些信息。你可以帮他求出来吗?
下图是房子示意地图,墙和门不占地方但只会挡住去路,其中1、2、3表示是门,key只会在第四个功能里会用到。
功能要求:
1、 根据地图给出破房子里的房间数量
2、 找出这破房子里最大的房间的面积(单元格的数量)
3、 小Y想只拆掉一堵墙或门,就可得到一个最大的房间。请帮他找出最大的新房间的面积和要拆的墙。(千万别拆了破房子的外墙)
4、 根据数据给出的地图,游戏开始了,有一个任务是“抢旗”,小Y需要在一个设定的起点,最快地到达旗帜所在位置,在这个过程中他可能会遇到一些门,门分为G类(1<=G<=10),要得到对应的钥匙才能打开对应的门,同一类的门可用一把对应的钥匙打开,可能会有多把同一类的钥匙或多个同一类的门。请问他需要经过多少单元格才能到达旗帜所在处。(不包括起点,他只能垂直或水平移动,不能对角线移动,拿到钥匙后是留着多次使用的)
算法程序的输入输出格式:
输入:
第一行是一个整数,表示测试数据的组数。
每组测试数据包括:
第一行是两个整数为N和M (N是行,M是列,1<=N<=M <=50)
第二行是一个整数D,表示房子里门和墙的总个数(房子的外轮廓默认有墙,所以不算在这个D里);
接着,有D行数据,每行有5个整数X1,Y1,X2,Y2,G;
其中,当G=0时,表示坐标(X1,Y1)与(X2,Y2)之间是一堵墙;
当G>=1时,表示坐标(X1,Y1)与(X2,Y2)之间有一道第G类的门
(0<=G<=10,|X1-X2|+|Y1-Y2|=1)
然后是一个整数K,表示房子里放置的钥匙总数(0<=K<=N*M);
再接着有K行数据,每行数据中有3个整数X,Y,G;表示这把钥匙放在坐标(X,Y)里,并且是用来开启第G类门的。
最后是4个整数X1,Y1,X2,Y2,表示起点坐标(X1,Y1)和旗帜坐标(X2,Y2)。
输出:
对于每组测试数据,输出5行。
第一行:房间的数量。
第二行:最大的房间的面积。
第三行:拆掉一堵墙或门后,可得的最大的新房间的面积
第四行:拆除哪堵墙或门可以得到面积最大的新房间。若有多个解时,选最西方向的解,若还有多个解时,选择最南方向的解。用这堵墙或门的南边坐标的北边,或者是西边坐标的东边来表示这堵墙或门。输出这个坐标的X、Y和方位(“N”表示北,”E”表示东)
第五行:小Y到达旗帜所在处所经过的单元格(不包括起点,他只能垂直或水平移动,不能对角线移动),若无解则返回-2。
每组测试数据输出一个空行。
若某个功能没完成,则这一行返回-1。
样例输入:
2
1 2
1
1 1 1 2 1
1
1 1 1
1 1 1 2
5 5
11
1 3 1 4 1
2 2 3 2 0
2 3 2 4 0
3 1 3 2 0
3 1 4 1 2
3 2 3 3 0
3 3 3 4 0
3 3 4 3 3
3 4 4 4 0
4 4 4 5 0
5 4 5 5 0
3
3 4 2
1 2 1
3 3 3
1 1 5 5
样例输出:
2
1
2
1 1 E
1
3
9
17
4 1 N
8
提示:
2个测试用例图示如下