北京林业大学“计蒜客”杯程序设计竞赛 网络赛 常见问题——大钉骑马走江湖

在象棋界厮杀的大钉,面对由矩阵构成的江湖,运用马走日的规则,寻找从起点到终点的最短路径。通过输入矩阵的行数、列数以及棋盘布局,输出最少需要多少步到达终点,若无法到达则输出-1。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大钉骑马走江湖

时间限制(C/C++):1000MS/3000MS          运行内存限制:65536KByte
总提交:34            测试通过:17

描述

江湖是什么,对于在象棋界厮杀的大钉来说,江湖就是一个矩阵,他的目标,就是在江湖之中骑着马,从他的位置出发,走到终点。


当然,大钉的马也遵从中国象棋中的“马走日”的规则,而且在矩阵中,也会有一些障碍物,马不能跳到障碍物上;如果大钉的马面前有障碍物,即被“别马腿”,那么他将不能跳向有障碍物的左前和右前这两个方向。


请问最少需要多少步,大钉才能骑着马跳到终点。


输入

有多组测试样例。


每组第一行有两个数 n 和 m,代表矩阵的行数和列数,2 <= n <= m < 100。


接下来输入 n 行的字符串,其中 's' 代表起点,'e' 代表终点,'.'代表空地,'#'代表障碍物。


输出

对应每组输入,输出骑马跳到终点的最小步数,如果跳不到终点,输出 -1。

样例输入

3 3
s..
...
..e

3 3
s#.
...
#.e

样例输出

4
-1

题目来源

BJFUACM


代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
char map[110][110];
int n,m;
int dis[10][2]={-1,2,1,2,2,1,2,-1,1,-2,-1,-2,-2,-1,-2,1};
int dir[10][2]={0,1,0,1,1,0,1,0,0,-1,0,-1,-1,0,-1,0};
struct point
{
    int x,y,step;
};
point s;
point e;
int bfs(point s,point e)
{queue<point>tp;
point next;
map[s.x][s.y]='*';
 s.step=0;
 tp.push(s);
 while(!tp.empty())
 {
     s=tp.front();
     tp.pop();//dis,dir
     if(s.x==e.x&&s.y==e.y)
     return s.step;
     for(int i=0;i<8;i++)
     {
         next.x=s.x+dis[i][0];
         next.y=s.y+dis[i][1];
         if(map[s.x+dir[i][0]][s.y+dir[i][1]]!='#'&&next.x>=0&&next.x<n&&next.y>=0&&next.y<m&&map[next.x][next.y]!='#'&&map[next.x][next.y]!='*')
         {
             map[next.x][next.y]='*';
             next.step=s.step+1;
             tp.push(next);
         }
     }
 }
 
return -1;
 
}
int main()
{int i,j;
    while(~scanf("%d%d",&n,&m))
    {   for(i=0;i<n;i++)
       { getchar();
         for(j=0;j<m;j++)
         {
             scanf("%c",&map[i][j]);
             if(map[i][j]=='s')
             {
                 s.x=i;
                 s.y=j;
             }
             else if(map[i][j]=='e')
             {
                 e.x=i;
                 e.y=j;
 
             }
         }
       }
       printf("%d\n",bfs(s,e));
 
 
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值