游戏在一个分割成w * h个长方格子的矩形板上进行。如图所示,每个长方格子上可以有一张游戏卡片,也可以没有。当下面的情况满足时,我们认为两个游戏卡片之间有一条路径相连: 
   路径只包含水平或者竖直的直线段。路径不能穿过别的游戏卡片。但是允许路径临时离开矩形板。 
   下面是一个例子: 这里在(1, 3)和(4, 4)处的游戏卡片是可以相连的。而在 (2, 3) 和 (3, 4) 处的游戏卡是不相连的,因为连接他们的每条路径都必须要穿过别的游戏卡片。

你现在要在小游戏里面判断是否存在一条满足题意的路径能连接给定的两个游戏卡片。

这道题最早遇见是在高二的县里的模拟赛的时候,感觉是一个经典的问题。

分析,首先因为要求是最少的线段,实际就是用最少的转弯,那就每个方向光搜出去应该是能到的最远处内的所有点都是应该在该层中被加入队列的。

于是按照线段的转折次数为层数进行光搜即可。其中要注意一些细节。

该题出现在P大的编程网格上,岁月匆匆感慨万千,因为细节没有处理好,导致大数据上WA了若干次。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cstring>
#include <queue>
using namespace std;
const int maxN = 100+10;
const int dir[4][2]= {0,1,0,-1,-1,0,1,0};
char s[maxN], map[maxN][maxN];
int sx,sy,tx,ty,n,m,ans;
int f[maxN][maxN][4],arrive[maxN][maxN][4];
struct Node{
int x,y,Dir;
}node,newNode;
queue<Node> q;
bool inside(int x,int y)
{
return (x>=0 && x<=n+1 && y>=0 && y<=m+1);
}
bool ok()
{
memset(arrive,0,sizeof(arrive));
memset(f,127,sizeof(f));
bool canArrive = false;
while (!q.empty()) q.pop();
for (int k = 0; k < 4;++k)
{
node.x = sx; node.y = sy; node.Dir = k;
q.push(node);
f[sx][sy][k]=1;
arrive[sx][sy][k]=true;
}
while (!q.empty())
{
Node now = q.front();
q.pop();
arrive[now.x][now.y][now.Dir] == false;
for (int k = 0; k < 4; ++k)
for (int step = 1; step <= maxN ; ++step)
{
int x=now.x+dir[k][0]*step;
int y=now.y+dir[k][1]*step;
if ( !inside(x,y)) break;
if (tx == x && ty == y)
{
f[x][y][k]=min(f[x][y][k],
f[now.x][now.y][now.Dir]+(now.Dir != k));
canArrive = true;
}
if (map[x][y] == 'X' ) break;
if (f[now.x][now.y][now.Dir]+(now.Dir != k)< f[x][y][k])
{
f[x][y][k]=f[now.x][now.y][now.Dir]+(now.Dir != k);
if (!arrive[x][y][k])
{
arrive[x][y][k]=true;
newNode.x = x; newNode.y = y; newNode.Dir = k;
q.push(newNode);
}
}
}
}
return canArrive;
}
int main()
{
int Test = 0;
while (scanf("%d%d",&m,&n)==2)
{
if (m==0  && n==0) break;
getchar();
printf("Board #%d:\n",++Test);
for (int i = 0; i <= n+1; ++i)
for (int j = 0; j <= m+1; ++j) map[i][j]='S';
for (int i = 1;i <= n; ++i)
{
gets(s);
for (int j = 1; j <= m ;++j)
map[i][j] = s[j-1];
}
int Pair = 0;
while(scanf("%d%d%d%d",&sy,&sx,&ty,&tx))
{
if (sx+sy+tx+ty == 0) break;
if (!ok()) printf("Pair %d: impossible.\n",++Pair);
else
{
int ans = maxN * maxN;
for (int k = 0 ; k < 4; ++k)
ans=min(ans,f[tx][ty][k]);
printf("Pair %d: %d segments.\n",++Pair,ans);
}
}
}
return 0;
}

小游戏 (最少线段连线问题)相关推荐

  1. 热身小游戏(线段树,单修区修区查)

    热身小游戏(线段树,单修区修区查) 链接:https://ac.nowcoder.com/acm/contest/37160/G 来源:牛客网 Alice 和 Bob 在玩热身小游戏,Alice 给出 ...

  2. 原来微信里有这么多好玩的3D小游戏了

    自从<跳一跳>打开微信小游戏之门伊始,小游戏之势已然燎原.小编体验了上千款微信小游戏,虽然当前仍是以2D休闲游戏为主,但是3D小游戏也越来越多了(悄悄的说一下,小编已知的3D游戏里除了2款 ...

  3. 贝塞尔线 ---- 闯关解迷小游戏

    一款益智小游戏,动感的音乐,简章的操作,来释放你的大脑吧. 开始游戏:点击移动红圈(红线)到指定的蓝点,使红线和背景的蓝线路径重合,步数越少越好,分数越高越好. 消除模式:红线和蓝线重合会消除,把屏幕 ...

  4. 云开发谁是卧底线下小游戏发牌助手微信小程序源码-亲测可用

    云开发谁是卧底线下小游戏源码,发牌助手微信小程序源码. "谁是卧底OL"是一个非常有趣,风靡全国的比拼语言表述能力.知识面与想象力的游戏. 谁是卧底OL是一款由开发商北游科技倾力打 ...

  5. 分享一个c++连线小游戏

    前言 想看正文的请跳过.热衷小游戏的我又回来了!上次准备给飞机大战小游戏升级,发现写的一坨,难维护拓展,吸取上次教训,这次的清爽多啦!(抽时间把飞机大战重写,再加上联机功能吧),分享给感兴趣的小伙伴, ...

  6. 北京 | 微信小程序及小游戏开发者线下交流会

    七月中旬,Google 推出的首款小程序<猜画小歌>引发了朋友圈的画图大战,也让更多人的目光重新回到了微信小程序上.微信用户量庞大,这使得小程序自上线后便受到众多开发者的关注,其种类更是覆 ...

  7. 微信小游戏:Cocos Creator《守卫竹林》线上游戏源码资源分享

    <守卫竹林>源码资源分享 <守卫竹林>的云开发方式与文章微信小游戏:云开发(三)云开发和CocosCreator解决方案介绍的相同,可以作为参考 <守卫竹林>下载链 ...

  8. 基于HTML5的WebGL实现的2D3D迷宫小游戏

    为了实现一个基于HTML5的场景小游戏,我采用了HT for Web来实现,短短200行代码,我就能实现用"第一人称"来操作前进后退上下左右,并且实现了碰撞检测. 先来看下实现的效 ...

  9. 如何用 JavaScript+Canvas 开发一款超级烧脑小游戏?

    作者 | huangjianke 责编 | 伍杏玲 出品 | CSDN(ID:CSDNnews) [CSDN 编者按]据微信最新数据,微信小游戏累计注册用户量已突破10亿.那么初学者如何开发一款好玩又 ...

最新文章

  1. 新装myeclispse8.6GA、@Override出错
  2. iOS开发那些事-故事板实现标签导航
  3. Hive的基本操作-排序
  4. android button自定义样式详解,Android自定义格式显示Button的布局思路
  5. 条件转移指令和无条件转移指令练习
  6. cgblib 代理接口原理_Java开发者你还不知道?告诉你Dubbo 的底层原理,面试不再怕...
  7. 微软为 Java 开发者推出 VSCode 安装程序
  8. swift 脚本_Swift脚本和命令行参数
  9. 常见掌握类库与工具体系图 艾提拉总结 Atitit 文档资料处理重要类库与工具体系树 Configuration yml xml jsoup  Net apache commons net
  10. MD5破解实验与个人的MD5暴破程序介绍
  11. go语言的字符串长度
  12. html 边框上下都添加文字,抖音上下边框加文字的视频制作方法教程分享
  13. python游戏计分代码_Python笔试题之设计“跳一跳”小游戏计分器
  14. mkv无损转换成mp4,方法步骤
  15. 李维:我的回忆和一些有趣的事(About Borland)(转载)
  16. html5画布正五角星,canvas 正五角星如何画
  17. KEIL设置程序起始地址无效解决方法,STM32 IAP程序起始地址
  18. 2021软件工程保研经历
  19. php安全新闻早八点-Microdoor-第三季
  20. 怎么实现自己的第一个小目标?

热门文章

  1. 俞敏洪:像水一样积蓄自己的力量
  2. 一次关于前端的内存泄漏
  3. 计算BMI身体质量指数
  4. ASP.NET微信快速开发框架源码【源码分享】
  5. 如何编译ASP.NET Core源码
  6. 计算机怎么关闭开机自启应用,如何关闭电脑开机自动启动的软件程序
  7. 关于elementui的table主子表展示数据
  8. idea编辑jsp页面部分页面变黄绿色并且不提示,解决方法很简单
  9. 1095 Anigram单词
  10. 手欠! 退出icloud后, 桌面文件全没了——解决方法