您的位置:首页 > 理论基础 > 计算机网络

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

2016-04-25 10:43 417 查看


大钉骑马走江湖

时间限制(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));

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: