POJ 1101 The Game(BFS+判方向)
The Game
Description
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
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
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. (PE不知不觉)
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.
题目大意:类似于一个连连看游戏吧。求最小线段数。如例图。线段数。一个4,一个3。
思路:我想那种求图,两点最小步数的题,大家都做过。
可是,这个怎么办了。仅仅有加一个 dire记录方向就可以。假设,next.dire!=cur.dire.则线段数+1.
代码例如以下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cctype>
#include<queue>
#include<stack>
#define INF 0x3f3f3f3f
#define maxn 100001 using namespace std; int n,m;
char map[80][80];
int go[4][2]={{-1,0},{0,1},{1,0},{0,-1}};// 0 1 2 3
int vis[80][80];
int sx,sy,ex,ey;
struct node{
int x,y;
int seg;
int dire;
node(){}
node(int a,int b,int c,int d)
{
x=a;
y=b;
seg=c;
dire=d;
}
}; int bfs()
{
queue<node> que;
que.push(node(sx,sy,0,-1));
memset(vis,0,sizeof vis);
vis[sx][sy]=1;
while(!que.empty())
{
node cur=que.front();
node next;
que.pop();
for(int i=0;i<4;i++)
{
next.x=cur.x+go[i][0];
next.y=cur.y+go[i][1];
next.dire=i;
if(next.x>=0&&next.x<=n+1&&next.y>=0&&next.y<=m+1&&!vis[next.x][next.y])
{
if(next.dire==cur.dire)
next.seg=cur.seg;
else
next.seg=cur.seg+1;
if(next.x==ex&&next.y==ey)
return next.seg;
if(map[next.y][next.x]!='X')
{
//cout<<next.x<<next.y<<next.seg<<endl;
vis[next.x][next.y]=1;
que.push(next);
}
}
} } return 0;
} int main()
{
int t=0;
while(scanf("%d%d",&n,&m),n||m)
{
t++;
int cas=0;
memset(map,' ',sizeof map); for(int i=1;i<=m;i++)
{
getchar();
for(int j=1;j<=n;j++)
scanf("%c",&map[i][j]); }
//cout<<"15"<<map[4][2]<<endl; printf("Board #%d:\n",t);
while(1)
{
//cout<<"---->\n";
scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
//cout<<sx<<sy<<ex<<ey<<endl;
if(sx||sy||ex||ey)
{
int temp=bfs();
//cout<<"--------->>>>>>>>\n";
if(temp)
printf("Pair %d: %d segments.\n",++cas,temp);
else
printf("Pair %d: impossible.\n",++cas);
} else
break; }
printf("\n"); } return 0;
}
POJ 1101 The Game(BFS+判方向)的更多相关文章
- poj 3414 Pots 【BFS+记录路径 】
//yy:昨天看着这题突然有点懵,不知道怎么记录路径,然后交给房教了,,,然后默默去写另一个bfs,想清楚思路后花了半小时写了120+行的代码然后出现奇葩的CE,看完FAQ改了之后又WA了.然后第一次 ...
- poj 2049(二分+spfa判负环)
poj 2049(二分+spfa判负环) 给你一堆字符串,若字符串x的后两个字符和y的前两个字符相连,那么x可向y连边.问字符串环的平均最小值是多少.1 ≤ n ≤ 100000,有多组数据. 首先根 ...
- 最短路径问题,BFS,408方向,思路与实现分析
最短路径问题,BFS,408方向,思路与实现分析 继上回挖下的坑,不知道大家有没有认真看最小生成树呢?很简单,这回也讲讲正常难度的,看不懂就来这里看看,讲的很好~~ 最短路径问题 说起这个问题,先说个 ...
- poj 1465 Multiple(bfs+余数判重)
题意:给出m个数字,要求组合成能够被n整除的最小十进制数. 分析:用到了余数判重,在这里我详细的解释了.其它就没有什么了. #include<cstdio> #include<cma ...
- POJ 1101 简单BFS+题意
The Game 题意: Description One morning, you wake up and think: "I am such a good programmer. Why ...
- Poj 1166 The Clocks(bfs)
题目链接:http://poj.org/problem?id=1166 思路分析:题目要求求出一个最短的操作序列来使所有的clock为0,所以使用bfs: <1>被搜索结点的父子关系的组织 ...
- poj 1077 Eight(双向bfs)
题目链接:http://poj.org/problem?id=1077 思路分析:题目要求在找出最短的移动路径,使得从给定的状态到达最终状态. <1>搜索算法选择:由于需要找出最短的移动路 ...
- poj 3026 Borg Maze (bfs + 最小生成树)
链接:poj 3026 题意:y行x列的迷宫中,#代表阻隔墙(不可走).空格代表空位(可走).S代表搜索起点(可走),A代表目的地(可走),如今要从S出发,每次可上下左右移动一格到可走的地方.求到达全 ...
- poj 1324 状态压缩+bfs
http://poj.org/problem?id=1324 Holedox Moving Time Limit: 5000MS Memory Limit: 65536K Total Submis ...
随机推荐
- iOS数字媒体开发浅析
概述 自然界中的所有看到的听到的都是模拟信号,模拟信号是随时间连续变化,然而手机电脑等信息都属于数字媒体,它们所呈现的内容就是把自然界中这些模拟信号转换成数字信号然后再传递给我们.数字信号不是连续的是 ...
- [Python] Read and plot data from csv file
Install: pip install pandas pip install matplotlib # check out the doc from site import pandas as pd ...
- 【计算机视觉】基于Kalman滤波器的进行物体的跟踪
预估器 我们希望能够最大限度地使用測量结果来预计移动物体的运动. 所以,多个測量的累积能够让我们检測出不受噪声影响的部分观測轨迹. 一个关键的附加要素即此移动物体运动的模型. 有了这个模型,我们不仅能 ...
- BZOJ2895: 球队预算
[传送门:BZOJ2895] 简要题意: 在一个篮球联赛里,有n支球队,球队的支出是和他们的胜负场次有关系的,具体来说,第i支球队的赛季总支出是Ci*x^2+Di*y^2,Di<=Ci.(赢得多 ...
- BZOJ3875: [Ahoi2014&Jsoi2014]骑士游戏
[传送门:BZOJ3875] 简要题意: 给出n种怪物,每种怪物都带有三个值,S[i],K[i],R[i],分别表示对他使用普通攻击的花费,使用魔法攻击的花费,对他使用普通攻击后生成的其他怪物. 每种 ...
- dotnet 命令的使用
dotnet --info PS E:\GitHub\KerryJiang\SuperSocket> dotnet --info.NET Command Line Tools (2.1.4) P ...
- Python(六) Python 函数
一.认识函数 help(方法名字) help(round) 1.功能性 2.隐藏细节 3.避免编写重复的代码 4.组织代码 自定义函数 二.函数的定义及运行特点 # 递归 def sum_num(n ...
- C# MVC js 跨域
js 跨域: 第一种解决方案(服务端解决跨域问题): 跨域是浏览器的一种安全策略,是浏览器自身做的限制,不允许用户访问不同域名或端口或协议的网站数据. 只有域名(主域名[一级域名]和二级域名).端口号 ...
- vue中剖析中的一些方法
1 判断属性 71 -81 var hasOwnProperty = Object.prototype.hasOwnProperty; /** * Check whether the object h ...
- WebAssembly学习(六):AssemblyScript - 限制与类型
一.限制 将无类型的JavaScript编译为WebAssembly没有意义,因为它最终会导致运行其中较慢的一个JavaScript. 相反,AssemblyScript专注于WebAssembly擅 ...