#P1101. The Game

    ID: 102 传统题 1000ms 256MiB 尝试: 1 已通过: 1 难度: 10 上传者: 标签>搜索BFS动态规划贪心Mid-Central European Regional Contest 1999

The Game

题目描述(Description)

某天早晨,你醒来后心想:“我真是个优秀的程序员,何不写个游戏赚点钱呢?”于是你决定开发一个电脑游戏。

游戏发生在一个由 w×hw \times h 个方格组成的矩形棋盘上。棋盘上的每个格子可能包含一个棋子,也可能为空(如下图所示)。

游戏中一个重要的规则是:判断两个棋子是否可以通过一条路径连接,且该路径需满足以下两个条件:

路径由若干个直线段组成,每个线段要么是水平的,要么是垂直的;

路径不能穿过其他棋子;

(允许路径在中间暂时离开棋盘后又回到棋盘上)

例如:

位于 (1,3)(1,3)(4,4)(4,4) 的棋子可以连接;

位于 (2,3)(2,3)(3,4)(3,4) 的棋子无法连接,因为每条路径都会穿过至少一个其他棋子。

你需要实现的是这个功能的判断部分,判断两个棋子是否可以连接,并输出其最少由多少段直线组成。

输入格式(Input)

输入数据包含若干个棋盘描述:

每个棋盘的第一行包含两个整数 wwhh,表示棋盘的宽度和高度,满足 1w,h751 \leq w,h \leq 75

接下来的 hh 行,每行包含 ww 个字符:

'X' 表示该格子上有棋子;

' '(空格)表示该格子为空;

然后跟若干行,每行包含四个整数 x1,y1,x2,y2x_1, y_1, x_2, y_2,表示两颗棋子的坐标(满足 1x1,x2w1 \leq x_1,x_2 \leq w1y1,y2h1 \leq y_1,y_2 \leq h);

坐标 (1,1)(1,1) 表示左上角;

坐标保证不相同;

每个棋盘的棋子对以一行 0 0 0 0 结束;

所有输入以一组 w = 0, h = 0 的棋盘描述作为结束标志,不需要处理这组数据。

输出格式(Output)

对每个棋盘,输出一行 Board #n:,其中 nn 是该棋盘的编号(从 11 开始);

对该棋盘的每对棋子:

输出一行 Pair m: ,其中 mm 是该对棋子的编号(每个棋盘从 11 开始编号);

若两颗棋子可以连接,输出最少的段数,如 4 segments.;

否则输出 impossible.;

每个棋盘输出完毕后,输出一个空行。

输入样例(输入数据 1)

5 4
XXXXX
X   X
XXX X
 XXX 
2 3 5 3
1 3 4 4
2 3 3 4
0 0 0 0
0 0

输出样例(输出数据 1)

Board #1:
Pair 1: 4 segments.
Pair 2: 3 segments.
Pair 3: impossible.