题目描述

在一个 n*m 的棋盘上有一些点已被己方棋子占用。有一只马要从点 S(x_s, y_s) 走到点 T(x_t, y_t) ,现求一个步数最少的方案。马的每一步是这样走的:先从起点 A 向上下左右任意方向走 1 格经过点 B,再顺时针或逆时针旋转 π/4 后走 sqrt(2) 格到达点C。但这是中国象棋里的马而不是国际象棋里的 knight,即如果经过的点 B 被占用,则会发生“蹩(bié)马腿”不能这样走。只有当B 与 C 都未被占用时马才能从 A 跳到 C。
输入格式

输入包含多组数据,以 EOF 结束。

每组数据第一行包含六个整数m,n,x_s,y_s,x_t,y_t。接下来 n 行给出一个 n*m 的〇一矩阵,其中 1 表示已经被占用的格子。

0 < m, n <= 100

0 <= x_s, x_t < n

0 <= y_s, y_t < m

输出

对于每组数据,输出所求的最少步数。若不能到达(包含起点或终点被占用的情况),则输出 No solution!。
样例输入

4 4 0 0 3 2
0010
0000
0000
0001
4 4 0 0 3 2
0010
0000
0100
0001
样例输出

3
No solution!

#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
typedef struct node {
int x, y;
} node;
const int dx[8] = {2, 1, -1, -2, -2, -1, 1, 2};
const int dy[8] = {1, 2, 2, 1, -1, -2, -2, -1};
const int bx[8] = {1, 0, 0, -1, -1, 0, 0, 1};
const int by[8] = {0, 1, 1, 0, 0, -1, -1, 0};
bool a[105][105], vis[105][105];
int step[105][105];
int m, n, sx, sy, tx, ty;
bool check(int x, int y) {
if (x >= 0 && x < m && y >= 0 && y < n)
return true;
else
return false;
}
int bfs() {
memset(vis, 0, sizeof (vis));
memset(step, 0, sizeof (step));
queue<node> q;
node h, n;
h.x = sx;
h.y = sy;
vis[sx][sy] = true;
q.push(h);
while (!q.empty()) {
h = q.front();
q.pop();
if (h.x == tx && h.y == ty)
return step[h.x][h.y];
for (int i = 0; i < 8; i++) {
n.x = h.x + dx[i];
n.y = h.y + dy[i];
//条件很多
if(check(n.x, n.y) && a[h.x+bx[i]][h.y+by[i]] == 0 && !vis[n.x][n.y] && a[n.x][n.y] == 0) {
q.push(n);
step[n.x][n.y] = step[h.x][h.y] + 1;
vis[n.x][n.y] = true;
}
}
}
return -1;
}
int main() {
while (scanf("%d%d%d%d%d%d", &m ,&n, &sx, &sy, &tx, &ty) == 6) {
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
scanf("%1d", &a[i][j]);
if (a[sx][sy] == 1 || a[tx][ty] == 1) {
printf("No solution!\n");
continue;
}
int ans = bfs();
if (ans == -1) {
printf("No solution!\n");
continue;
}
else
printf("%d\n", ans);
}
return 0;
}

2014_3_29_周赛 马腿上的最短路相关推荐

  1. highcharts 怎么去掉鼠标悬停效果_腿上肥胖纹怎么去掉 大腿肥胖纹怎么消除

    可能很多人都会有短期内体重波动过大的情况,这种情况下身体身体产生的纹路,就是肥胖纹.身体最容易出现纹路的部位就是腿部,那么,大腿肥胖纹怎么消除 腿上肥胖纹怎么去掉呢?下面为大家分享了去除肥胖纹方法,大 ...

  2. 亚马逊的vps多少钱一个月_如何查看您在亚马逊上花了多少钱

    亚马逊的vps多少钱一个月 Have you ever wondered how much you've spent at Amazon during your lifetime? Whether y ...

  3. 为什么这款 CPU 在亚马逊上卖得最火?

    AMD锐龙5 3600评测:为什么这款CPU是亚马逊上卖得最火的CPU? 作者 | Ian Cutress 译者 | 弯月,责编 | 郭芮 头图 | CSDN 下载自视觉中国 出品 | CSDN(ID ...

  4. 20200926:(leetcode207周周赛题解(上))

    leetcode207周周赛题解(上) 题目 思路与算法 代码实现 写在最后 题目 1.1592. 重新排列单词间的空格 2.1593. 拆分字符串使唯一子字符串的数目最大 思路与算法 第一题注意分割 ...

  5. 20200920:leetcode35周双周赛题解(上)

    leetcode35周双周赛题解(上) 题目 思路与算法 代码实现 写在最后 题目 1.5503. 所有奇数长度子数组的和 2.5505. 所有排列中的最大和 思路与算法 第一题暴力就行了,看了很多大 ...

  6. 20200814:力扣201周周赛题解记录上

    力扣201周周赛题解记录上 题目 思路与算法 代码实现 写在最后 题目 整理字符串 找出第 N 个二进制字符串中的第 K 位 思路与算法 第一题这种类似消消乐的东西都是直接用栈来实现的,注意代码细节 ...

  7. 亚马逊视频下载用什么工具:试试专业亚马逊视频下载器-Tuneboto Amazon Video Downloader中文版 | 亚马逊上的视频怎么下载?

    Tuneboto Amazon Video Downloader 是一款优秀的一站式高速亚马逊视频下载器软件,拥有直观简洁的用户界面和超强的亚马逊视频解析下载能力,可以帮助用户将任何Amazon Pr ...

  8. 网聊是不是就要劈腿上床?

    网聊是不是就要劈腿上床? 人生是一场电影,我们花大半个人生去编写结局,到头来都是THE END: 人生是一场游戏,我们需要不断有兴致地去玩耍,可是游戏总有结束的时候: 人生是一盘跳棋,不是你输就是我赢 ...

  9. 武汉星起航:深度剖析个人卖家在亚马逊上开店的流程

    亚马逊是一个比较受欢迎的跨境电商平台,部分卖家想在亚马逊上开店,但是不知道开店流程.下面星起航将为大家介绍一下个人卖家怎么在亚马逊上开店,主要包括以下几个步骤: 创建亚马逊账户:访问亚马逊官网,点击[ ...

最新文章

  1. python安装的模块在pycharm中能用吗_pycharm内无法import已安装的模块问题解决
  2. 不同品牌发电机组间的并机知识
  3. 《好未来编程题》 输入n个整数,输出出现次数大于等于数组长度一半的数
  4. 详述 IntelliJ IDEA 插件的安装及使用方法
  5. GridView调用setAdapter()函数时发生错误
  6. html固定表的属性是什么,css如何固定表头
  7. Android的面孔_Actiyity
  8. raspberry pi_探索Raspberry Pi Sense HAT
  9. java接口回调测试
  10. Auto.js 如何WIFI连接VS Code插件
  11. 凑热闹买了个小米剃须刀
  12. 计算机网络 | 无盘工作站的建立
  13. 截图工具FastStone Capture
  14. 语音信号处理基础知识之频谱、相位谱、幅度谱、功率谱及语谱图
  15. verilog实现N分频电路
  16. mysql查询1999年后出生的_饭后笑笑 1999年出生的和2000年出生的秘密
  17. 新手安装arch安装界面wifi-menu连接不了wifi
  18. 年会抽奖程序,基于 Express + Three.js的 3D 球体抽奖程序
  19. 计算机格式化没有fat32,无需格式化 U盘FAT32转NTFS格式教程
  20. c语言判断一个数独是否合法,判断数独是否合法

热门文章

  1. SRPG游戏开发(二十三)第七章 寻路与地图对象 - 一 A*寻路算法(A* Search Algorithm)
  2. warning LNK4099: 未找到 PDB“vc120.pdb”(使用“dataserialize.lib(Data_processor.obj)”或在“E:\Santint\Santint_B
  3. 007.斐波拉契查找算法
  4. VSCode写leetcode
  5. mysql strlen 函数_sizeof和strlen函数区别
  6. 学python的第十八天
  7. 简单的条件概率乘积推导证明:p(c|a,b)p(b|a)=p(b,c|a)
  8. 我的第一篇文章,doc命令
  9. 实现android按键震动按键声音的机制
  10. Sanitize小知识