The Game
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 9746   Accepted: 2967

Description

One morning, you wake up and think: "I am such a good programmer. Why not make some money?'' So you decide to write a computer game.


The game takes place on a rectangular board consisting of w * h squares. Each square might or might not contain a game piece, as shown in the picture.




One important aspect of the game is whether two game pieces can be connected by a path which satisfies the two following properties:




It consists of straight segments, each one being either horizontal or vertical.





It does not cross any other game pieces.



(It is allowed that the path leaves the board temporarily.)



Here is an example:




The game pieces at (1,3) and at (4, 4) can be connected. The game pieces at (2, 3) and (3, 4) cannot be connected; each path would cross at least one other game piece.




The part of the game you have to write now is the one testing whether two game pieces can be connected according to the rules above.

Input

The input contains descriptions of several different game situations. The first line of each description contains two integers w and h (1 <= w,h <= 75), the width and the height of the board. The next h lines describe the contents
of the board; each of these lines contains exactly w characters: a "X" if there is a game piece at this location, and a space if there is no game piece.




Each description is followed by several lines containing four integers x1, y1, x2, y2 each satisfying 1 <= x1,x2 <= w, 1 <= y1,y2 <= h. These are the coordinates of two game pieces. (The upper left corner has the coordinates (1, 1).) These two game pieces will
always be different. The list of pairs of game pieces for a board will be terminated by a line containing "0 0 0 0".




The entire input is terminated by a test case starting with w=h=0. This test case should not be procesed.

Output

For each board, output the line "Board #n:", where n is the number of the board. Then, output one line for each pair of game pieces associated with the board description. Each of these lines has to start with "Pair m: ", where
m is the number of the pair (starting the count with 1 for each board). Follow this by "ksegments.", where k is the minimum number of segments for a path connecting the two game pieces, or "impossible.", if it is not possible to connect the two game pieces
as described above.



Output a blank line after each board.

Sample Input

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

Sample Output

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

Source

#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
using namespace std;
int dir[4][2] = {{0,1},{0,-1},{1,0},{-1,0}}; /* 右左上下 */
char map[77][77];
bool vis[77][77];
int x1,y1,x2,y2,w,h;
struct Node
{
int x,y,step,dir; /* x,y代表方向,step走了几步,dir = (0初始状态,1直走,2横走)*/
};
bool operator <(const Node &a,const Node &b)
{
return a.step > b.step;
}
int bfs()
{
memset(vis,0,sizeof(vis));
queue<Node>q;
Node s,e;
s.x = x1;
s.y = y1;
s.step = 0;
s.dir = 0;
vis[s.x][s.y] = 1;
q.push(s);
while(!q.empty())
{
s = q.front();
q.pop();
for(int i=0;i<4;i++)
{
e.x = s.x + dir[i][0];
e.y = s.y + dir[i][1];
if(e.x == s.x) e.dir = 2; /* 横 */
else e.dir = 1; /* 竖 */
if(e.x>=0&&e.x<=h+1&&e.y>=0&&e.y<=w+1&&!vis[e.x][e.y])
{ if(s.dir == 0) e.step = 1;
else
{
if(s.dir == e.dir) e.step = s.step;
else e.step = s.step + 1 ;
}
if(e.x == x2&&e.y==y2) return e.step;
if(map[e.x][e.y] ==' ')
{
vis[e.x][e.y] = 1;
q.push(e);
}
}
}
}
return false;
} int main()
{
int i,j,cnt=1,Step;
while(cin>>w>>h&&(w||h))
{
memset(map,' ',sizeof(map));
for(i=1;i<=h;i++)
{
getchar();
for(j=1;j<=w;j++)
map[i][j] = getchar();
}
printf("Board #%d:\n",cnt++);
int count = 1;
while(cin>>y1>>x1>>y2>>x2)
{
if(x1+y1+x2+y2==0) break;
printf("Pair %d: ",count++);
Step = bfs();
if(!Step)
printf("impossible.\n");
else printf("%d segments.\n",Step);
}
printf("\n");
}
return 0;
}

poj--1101--The Game(bfs)的更多相关文章

  1. POJ 1101 The Game(BFS+判方向)

        The Game Description One morning, you wake up and think: "I am such a good programmer. Why ...

  2. POJ 3984 迷宫问题(BFS)

    迷宫问题 Description 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, ...

  3. POJ 2435Navigating the City(bfs)

    题意:给你一个地图,’+’代表十字路口,‘-’‘|’表示街道,‘.’表示建筑物,‘s’,’E’ 起点和终点.输出从起点到终点的的 最短路径(包括方向和沿该方向的经过的十字路口数) 分析:ans[i][ ...

  4. poj 3669 Meteor Shower(bfs)

    Description Bessie hears that an extraordinary meteor shower is coming; reports say that these meteo ...

  5. 【POJ - 3414】Pots(bfs)

    Pots 直接上中文 Descriptions: 给你两个容器,分别能装下A升水和B升水,并且可以进行以下操作 FILL(i)        将第i个容器从水龙头里装满(1 ≤ i ≤ 2); DRO ...

  6. POJ 1573 Robot Motion(BFS)

    Robot Motion Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12856   Accepted: 6240 Des ...

  7. POJ 3126 Prime Path (BFS)

    [题目链接]click here~~ [题目大意]给你n,m各自是素数,求由n到m变化的步骤数,规定每一步仅仅能改变个十百千一位的数,且变化得到的每个数也为素数 [解题思路]和poj 3278类似.b ...

  8. poj 2251 Dungeon Master(bfs)

    Description You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is co ...

  9. POJ 3221 Diamond Puzzle(BFS)

    Description A diamond puzzle is played on a tessellated hexagon like the one shown in Figure 1 below ...

  10. 题解报告:poj 3669 Meteor Shower(bfs)

    Description Bessie hears that an extraordinary meteor shower is coming; reports say that these meteo ...

随机推荐

  1. python自动化测试框架(一)

    1.开发环境 名称 版本 系统 windows 7 python版本 2.7.14 IDE pycharm2017 2.大致框架流程 :展示了框架实现的业务流程 3.框架介绍 3.1 ======完善 ...

  2. JS——this与new

    this: 1.this只出现在函数中 2.谁调用函数,this就指的是谁 3.new People的this指的就是被创建的对象实例 new: 1.开辟内存空间,存储新创建的对象 2.把this设置 ...

  3. servlet-请求重定向

    package servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.ser ...

  4. html base 又一重大发现

    base 一个曾经不记得的标签,虽然接触Javaweb这么久了,但是还有很多基础性的东西都被我忽略掉了,还有很多基础但实用的技巧应该没有被我发现,虽然不使用这些技巧对功能实现没有多大影响.但是,发现这 ...

  5. eclipse的任务列表

    如上图所示,备注加  TODO  ,可以在tasks列表中显示,提示你还有哪些工作需要完善 昨天遇到一个问题,加了  TODO  任务列表里却不显示,后来发现是因为任务列表只显示了前100条,而我的项 ...

  6. 黑苹果开启retina,大分辨率的方法

    首先,管理分辨率RDM的软件这里下载: http://pan.baidu.com/s/1bpjL07P 在终端输入: curl -o ~/enable-HiDPI.sh https://raw.git ...

  7. SpringMVC注解配置处理器映射器和处理器适配器

    一.springmvc.xml中配置方式 <!--注解映射器 --> <bean class="org.springframework.web.servlet.mvc.me ...

  8. 浅谈animation里的forwards

    forwards可译为向前走, animation-fill-mode(动画填充模式),定义动画播放时间之外的状态 顾名思义,就是在动画播放完了之后给它一个状态 animation-fill-mode ...

  9. 【剑指Offer】66、机器人的运动范围

      题目描述:   地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子. 例如,当k为18时 ...

  10. HDU 2414 Chessboard Dance(模拟题,仅此纪念我的堕落)

    题目 模拟题也各种wa,我最近真的堕落了,,,,,智商越来越为负数了!!!!!!!! #include<stdio.h> #include<string.h> #include ...