题目描述
现在棋盘的大小不一定,由p,q给出,并且在棋盘中将出现障碍物(限制马的行动,与象棋走法相同)
输入
第一行输入n表示有n组测试数据。

每组测试数据第一行输入2个整数p,q,表示棋盘的大小(1<=p,q<=100)。
每组测试数据第二行输入4个整数,表示马的起点位置与终点位置。(位置的取值范围同p,q)
第三行输入m表示图中有多少障碍。
接着跟着m行,表示障碍的坐标。

输出
马从起点走到终点所需的最小步数。
如果马走不到终点,则输入“can not reach!”
样例输入
2
9 10
1 1 2 3
0
9 10
1 1 2 3
8
1 2
2 2
3 3
3 4
1 4
3 2
2 4
1 3
样例输出
1
can not reach!
提示
此题是一个搜索题,可用DFS或BFS,建议选择BFS(广搜)。一开始把马的起始点加入队列,然后用广搜的思想把此点能到达的其他点加入队列,这里需要一个数组用来记录此点在之前是否已经加入队列,如果加入过队列当中,就不需要再加入了,直到队列里的元素为空,或者搜索到了终点,搜索即停止,然后输出相应答案即可。

分析:此题为跳马问题,根据跳马的规则,是走‘日’字的对角,由于不能撇腿了,所以比平常的判断多一个,就是朝某个方向跳动时,必须不能撇腿!!!
DFS待写。。

代码:

#include<stdio.h>
#include<string.h>
#include<queue>
#include<iostream>
using namespace std;
const int N=105;
int p,q,sx,sy,tx,ty;
int k,vis[N][N],a[N][N];
int dx[8]= {2,2,-1,1,-2,-2,-1,1},dy[8]= {-1,1,-2,-2,-1,1,2,2};
int yd[4][2]= {1,0,0,-1,-1,0,0,1};
struct Node
{int x,y,cnt;
}que[15005];///注意队列的大小
int bfs()
{Node tou,next;tou.x=sx;tou.y=sy;tou.cnt=0;int front=1,rear=1;que[front]=tou;while(front<=rear){tou=que[front];//取队头front++;//删除队头if(tou.x==tx&&tou.y==ty)//到达目标位置return tou.cnt;int nx,ny;for(int i=0; i<8; i++){int t=i/2,x,y;x=tou.x,y=tou.y;int m=x+yd[t][0],n=y+yd[t][1];if(m>0&&m<=p&&n>0&&n<=q&&vis[m][n]) continue;///判断撇腿,这里若换成四个循环判断会节省时间nx=tou.x+dx[i];ny=tou.y+dy[i];if(nx>=1&&nx<=p&&ny>=1&&ny<=q&&vis[nx][ny]==0&&a[nx][ny]==0){next.x=nx;next.y=ny;next.cnt=tou.cnt+1;++rear;que[rear]=next;//加入队尾a[nx][ny]=1;}}}return -1;
}
int main()
{int t;scanf("%d",&t);while(t--){memset(vis,0,sizeof(vis));memset(a,0,sizeof(a));scanf("%d%d",&p,&q);scanf("%d%d%d%d",&sx,&sy,&tx,&ty);scanf("%d",&k);int i,x,y;for(i=0; i<k; i++){scanf("%d%d",&x,&y);vis[x][y]=1;//标记有障碍的位置}int ans=bfs();if(ans>=0)printf("%d\n",ans);elseprintf("can not reach!\n");}return 0;
}

中国象棋中的跳马问题相关推荐

  1. 中国象棋中的两个为什么:为什么会“蹩马脚”?为什么双方棋子叫法不同?

    1.为什么中国象棋中要设置马脚? 其实象棋并没有"设置"蹩马脚. 象棋中有一个通行走子原则--不能跨子行棋:对于一次走多格的棋子,如果路线上有其他棋子,则不能跨过该棋子走子(炮吃子 ...

  2. 为何中国象棋中要设置马脚

    为何中国象棋中要设置马脚? 因为封建皇权 不知道各位有没有开过一个脑洞: 如果单一棋子叛变,那么几步棋可以威胁王位? 直接说结论: 没有任何棋子可以在2步内胁君离开王位. 先说双士,他们是最靠近将帅的 ...

  3. “炮”在中国象棋历史中的演变

    "炮"在中国象棋历史中的演变 中国象棋是中华民族几千年历史文化的瑰宝,有着悠久的历史.源远流长博大精深.象棋融汇了古代战争与和平的思想和意识,象棋除具有雅俗共赏的娱乐性外,还 兼有 ...

  4. BZOJ 1801 [Ahoi2009]中国象棋(线性动规)(洛谷P2051)

    题意:就是在n*m的格子中放"炮"(中国象棋中的棋子)问有多少种放法,使得没有任意的两个炮相互攻击 思路:我们很容易的得到一列或者一行中最多放下两个炮(我也只能得到这些了,满脑子状 ...

  5. 团队-团队编程项目中国象棋-项目进度

    代码地址:https://gitee.com/zhanghongjian666/ZhongGuoXiangQi/blob/master/zgxq.html 当前进度画出了棋盘和棋子并且可以进行人人对战 ...

  6. Cocos2d-X开发中国象棋《九》走棋规则

    在上一节中实现了走棋,这篇博客将介绍中国象棋中的走棋规则 在写博客前先可能一下象棋的走棋规则: 1)将 将的坐标关系:横坐标相等,纵坐标相减绝对值等于1,或者纵坐标相等,横坐标相减绝对值等于1 将的特 ...

  7. 中国象棋程序的设计与实现(十)--棋盘的定义和绘制

    2019独角兽企业重金招聘Python工程师标准>>> 本篇简要介绍棋盘类的定义.棋盘的关键属性.棋盘绘制算法的骨架. 棋盘的详细绘制算法等内容,我们将在接下来的几篇进行详细介绍. ...

  8. 程序员大佬教你如何用python制作中国象棋!一看就会

    中国象棋想必大家都玩过,突发奇想,想着怎么用python把中国国粹的中国象棋做出来呢?????? 首先老样子看看用python做出来的效果: 国粹--中国象棋 第一步:导入资源包 第二步:初始化 第三 ...

  9. 中国象棋软件-引擎实现(六)局面评估

    前面已经讲过了棋局表示.着法生成.搜索算法(包括搜索辅助), 在象棋程序中如果说搜索算法是心脏,那么局面评估就是大脑.搜索算法负责驱动整个程序,而局面评估则负责对搜索的内容进行判断评价.因而搜索与局面 ...

最新文章

  1. 关于MYSQL中like 检索汉字问题。
  2. 对SqlCommandBuilder类理解
  3. linux安装指定mysql版本安装,linux yum安装指定版本mysql
  4. 世界各地奇葩讨债方法,竟百发百中
  5. abap数据类型转换_ABAP 中JSON格式的转换与解析
  6. libjpeg-turbo(2)
  7. laydate 和 Vue 奇怪的清空问题
  8. web服务启动后mysql崩溃_让Web站点崩溃最常见的七大原因
  9. window多台服务器文件同步,SyncToy 两台Windows电脑文件同步
  10. 二、图的遍历——深度优先遍历
  11. android怎么更换播放器,android 播放器切换 出错
  12. Java入门案例:模拟纸牌游戏拖拉机(升级)
  13. word文档分栏怎么设置
  14. 趣图:各种程序员的键盘热力图
  15. 转自千千:量化高频框架的搭建
  16. 精密加工与超精密加工的一些问题整理
  17. 奶爸词库1.56G下载
  18. 不在沉默中爆发就在沉默中死亡,处于沉寂状态的 Emotet 僵尸网络是怎样卷土重来的?(一)
  19. 2.1数据库系统的生命周期
  20. IEEE 802.11n IEEE 802.11g IEEE 802.11b什么区别?

热门文章

  1. stm8L 初始化系统时钟
  2. GD32F4(5):GD32F450时钟配置为200M过程分析
  3. Word文档打不开,乱码,各种问题 修复。(完美解决)
  4. kali字体设置-各种字体图标大小调整总结
  5. Vue 零基础小白学习指南(附教程)
  6. 数钱数到手抽筋html5,数钱数到手抽筋的经典句子
  7. 技嘉服务器主板装系统,技嘉AB350M-DS3H主板u盘重装系统win7教程
  8. 5年1万亿:揭秘中行供应链金融关键词
  9. Google Earth选项中的重要设置
  10. 利用菜单配置文件生成菜单