中国象棋中的跳马问题(学习搜索中)

简介: 文本主要讲中国象棋中的跳马问题

中国象棋中的跳马问题

时间限制: 2 Sec  内存限制:128 MB


题目描述


现在棋盘的大小不一定,由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!


思路:一开始把马的起始点加入队列,然后用广搜的思想把此点能到达的其他点加入队列,这里需要一个数组用来记录此点在之前是否已经加入队列,如果加入过队列当中,就不需要再加入了,直到队列里的元素为空,或者搜索到了终点,搜索即停止,然后输出相应答案即可。


#include<stdio.h>
#include<string.h>
#include<queue>
#include<iostream>
using namespace std;
int p,q;
int sx,sy,ex,ey;
int n,k,vis[111][111];
int hash[111][111];
int dx[]={2,2,-1,1,-2,-2,-1,1};
int dy[]={-1,1,-2,-2,-1,1,2,2};
struct nd
{
  int x,y,t;
};
int bfs()
{
  nd bmp,bemp;
  bemp.x=sx;
  bemp.y=sy;
  bemp.t=0;
  queue<nd>que; //定义一个队列
  que.push(bemp); //将bemp进队
  while(!que.empty())//队列非空
  {
    bemp=que.front(); //得到对首元素
    que.pop(); //将对首元素出队
    if(bemp.x==ex&&bemp.y==ey)
      return bemp.t;
    int xx;
    int yy;
    for(int i=0;i<8;i++)
    {
      int pp=i/2;
      if(pp==0)
        if(bemp.x+1<=p&&vis[bemp.x+1][bemp.y]==-1)
          continue;
      if(pp==1)
        if(bemp.y-1>=1&&vis[bemp.x][bemp.y-1]==-1)
          continue;
      if(pp==2)
        if(bemp.x-1>=1&&vis[bemp.x-1][bemp.y]==-1)
          continue;
      if(pp==3)
          if(bemp.y+1<=q&&vis[bemp.x][bemp.y+1]==-1)
          continue;
      xx=bemp.x+dx[i];
      yy=bemp.y+dy[i];
      if(xx>=1&&xx<=p&&yy>=1&&yy<=q&&vis[xx][yy]==0&&hash[xx][yy]==0)
      {
          bmp.x=xx;
          bmp.y=yy;
          bmp.t=bemp.t+1;
          que.push(bmp);
          hash[xx][yy]=-1;
      }
    }
  }
  return -1;
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
    while(n--)
    {
      scanf("%d%d",&p,&q);
      scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
            memset(vis,0,sizeof(vis));
      memset(hash,0,sizeof(hash));
            int i,ox,oy;
          scanf("%d",&k);
            for(i=0;i<k;i++)
      {
                scanf("%d %d",&ox,&oy);
                vis[ox][oy]=-1;
      }
      int ans=bfs();
        if(ans>=0)
          printf("%d\n",ans);
        else
          printf("can not reach!\n");
    }
    }
    return 0;
}
相关文章
|
4月前
|
存储 编解码 定位技术
推荐5款压箱底的宝贝,某度搜索就有
本文推荐了五款实用软件:1. WinDynamicDesktop,根据时间和地理位置自动更换桌面壁纸;2. NeeView,功能强大的图像浏览器,支持多种格式和便捷操作;3. 3171.cn,在线工具集网站,涵盖视频、音频、图片编辑等多种功能;4. Moo0VideoMinimizer,高效视频压缩软件,便于存储和分享;5. GnuCash,开源财务管理软件,帮助个人和小企业轻松管理财务。
41 0
|
8月前
|
JSON JavaScript 数据格式
超有意思的模糊搜索
超有意思的模糊搜索
|
数据采集 搜索推荐 安全
外贸关键词的搜索方法
答案是:使用搜索引擎,百度关键词规划工具,Ahrefs、SEMRush等。 搜索合适的外贸关键词是任何成功的谷歌SEO策略的基础。 选择正确的关键词不仅有助于增加网站流量,还可以吸引更有可能转化的目标受众。 以下是外贸关键词的一些有效搜索方法。 了解目标市场 在开始关键词研究之前,了解您的目标市场和目标客户的需求和兴趣至关重要。 这可以确保您的关键词与您的产品或服务以及目标受众紧密相关。
147 0
外贸关键词的搜索方法
|
JavaScript 前端开发 Linux
恕我直言,你可能连 GitHub 搜索都不会用 - 如何精准搜索的神仙技巧(下)
恕我直言,你可能连 GitHub 搜索都不会用 - 如何精准搜索的神仙技巧(下)
150 0
恕我直言,你可能连 GitHub 搜索都不会用 - 如何精准搜索的神仙技巧(下)
|
机器学习/深度学习 JavaScript 前端开发
恕我直言,你可能连 GitHub 搜索都不会用 - 如何精准搜索的神仙技巧(上)
恕我直言,你可能连 GitHub 搜索都不会用 - 如何精准搜索的神仙技巧(上)
290 0
恕我直言,你可能连 GitHub 搜索都不会用 - 如何精准搜索的神仙技巧(上)
|
监控 搜索推荐 算法
电商搜索“随便逛逛,想知道大家都在搜什么?现在什么最热门?”
有时候用户只是随便逛逛,没有明确的搜索意图,如何推荐更多优质查询词,引导其搜索、购买那?本文结合实际案例运用阿里云开放搜索的解决方案实现优化。
3786 0
电商搜索“随便逛逛,想知道大家都在搜什么?现在什么最热门?”
这届百度搜索不太行
百度一下,你可能什么都不知道。
563 0
|
Web App开发
去除百度置顶的广告,优化百度搜索
人人都唾弃百度的竞价排名,搜个关键词,前两页全tm广告,每每看到这个就恶心了。 解决办法: 安装浏览器插件,去掉置顶的广告。优化搜索。 正常来说三个插件就够了。
1779 0