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

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

中国象棋中的跳马问题

时间限制: 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;
}
相关文章
|
5月前
|
存储 编解码 定位技术
推荐5款压箱底的宝贝,某度搜索就有
本文推荐了五款实用软件:1. WinDynamicDesktop,根据时间和地理位置自动更换桌面壁纸;2. NeeView,功能强大的图像浏览器,支持多种格式和便捷操作;3. 3171.cn,在线工具集网站,涵盖视频、音频、图片编辑等多种功能;4. Moo0VideoMinimizer,高效视频压缩软件,便于存储和分享;5. GnuCash,开源财务管理软件,帮助个人和小企业轻松管理财务。
56 0
|
9月前
|
JSON JavaScript 数据格式
超有意思的模糊搜索
超有意思的模糊搜索
怎样才能让百度搜索到自己的csdn博客?
怎样才能让百度搜索到自己的csdn博客?
162 0
怎样才能让百度搜索到自己的csdn博客?
|
JavaScript 前端开发 Linux
恕我直言,你可能连 GitHub 搜索都不会用 - 如何精准搜索的神仙技巧(下)
恕我直言,你可能连 GitHub 搜索都不会用 - 如何精准搜索的神仙技巧(下)
154 0
恕我直言,你可能连 GitHub 搜索都不会用 - 如何精准搜索的神仙技巧(下)
|
机器学习/深度学习 JavaScript 前端开发
恕我直言,你可能连 GitHub 搜索都不会用 - 如何精准搜索的神仙技巧(上)
恕我直言,你可能连 GitHub 搜索都不会用 - 如何精准搜索的神仙技巧(上)
297 0
恕我直言,你可能连 GitHub 搜索都不会用 - 如何精准搜索的神仙技巧(上)
AtCoder 46-リモコン(搜索)
AtCoder 46-リモコン(搜索)
这届百度搜索不太行
百度一下,你可能什么都不知道。
569 0
|
搜索推荐
智能推荐:“相关性搜索”只给你最想要的
在过去十年里,搜索已经变得无处不在——搜索框已然成为各类网站、应用的基础标配。一个网站或者应用不提供搜索框,这是无法想象的事情。随着搜索在基础架构方面越来越多的难题得到解决,加之解决方案的商品化进程,搜索引擎的竞争已经从如何提供快速、可伸缩的搜索,转变成如何针对用户的信息需求提供最相关的匹配。
2755 0