马走日(bfs)

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

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

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

输入格式:

有多组测试样例。

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

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

输出格式:

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

样例输入

3 3
s..
...
..e

3 3
s#.
...
# .e

样例输出

4
-1
#include<iostream>
#include<queue>
#define Min 0xfffffff
using namespace std;

class Point{
    public: int x,y;
    public: int step;
};
char map[100][100];
int cx[8] = {2,2,1,1,-1,-1,-2,-2};//下 下 上 上 下 下 下 下 
int cy[8] = {1,-1,2,-2,2,-2,1,-1};//右 左 右 左 右 左 右 左 
int minn = Min;
int n,m;

//判定条件 
int check(int i,Point a,Point temp)
{
    //不能越界,不能撞墙 
    if(temp.x >= n||temp.x < 0||temp.y < 0||temp.y >=n||map[temp.x][temp.y] == '#')
    {
        return 0;
    }

    //不能 别马腿 
    switch(i)
    {
        case 0:
        case 1:return map[a.x+1][a.y] != '#';
        case 2:return map[a.x][a.y+1] != '#';
        case 3:return map[a.x][a.y-1] != '#';
        case 4:return map[a.x][a.y+1] != '#';
        case 5:return map[a.x][a.y-1] != '#';
        case 6:
        case 7:return map[a.x-1][a.y] != '#';
        default:return 0;
    }
    return 1;
}
void bfs()
{
    Point a,temp;
    queue<Point> q;
    a.x = 0;
    a.y =0;
    a.step = 0;
    map[0][0] = '#'; 
    q.push(a);
    while(!q.empty())
    {
        a = q.front();
        q.pop();
        for(int i = 0; i < 8; i++)//广度搜索 
        {
            temp.x = a.x + cx[i];
            temp.y = a.y + cy[i];
            temp.step = a.step+1;
            if(check(i,a,temp))
            {
                if(temp.x == n-1&&temp.y == m-1)
                {
                    if(temp.step < minn)
                    {
                        minn = temp.step;
                    }
                    continue;//防止顶点被设置为墙 
                }
                map[temp.x][temp.y] = '#';
                q.push(temp);//入对列 
            }
        }
    }
}
int main()
{
    cin >> n >> m;
    for(int i = 0; i < n ;i++)
    {
        for(int j = 0; j < m; j++)
        {
            cin >> map[i][j];
        }
    }
    bfs();
    cout << (minn==Min?-1:minn);
    return 0;   
}
感觉有某个地方错了,测试的时候错了,但是对于列子是对的,大家帮忙找找。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
可以使用BFS算法来实现广搜。具体实现步骤如下: 1. 定义一个8x8的棋盘,用二维数组表示,每个格子用一个数字表示,从0到63。 2. 定义一个队列,用来存储待搜索的节点。 3. 定义一个visited数组,用来记录每个节点是否已经被访问过。 4. 定义一个数组dx和dy,表示在棋盘上可以的8个方向。 5. 将起点加入队列,并将其标记为已访问。 6. 进入循环,直到队列为空。 7. 取出队列中的第一个节点,遍历其可以到达的所有节点。 8. 如果该节点未被访问过,将其加入队列,并标记为已访问。 9. 如果该节点是终点,返回当前步数。 10. 如果队列为空,表示无法到达终点,返回-1。 下面是代码实现: ```python from collections import deque def bfs(start, end): dx = [1, 2, 2, 1, -1, -2, -2, -1] dy = [2, 1, -1, -2, -2, -1, 1, 2] visited = [False] * 64 queue = deque([(start, 0)]) visited[start] = True while queue: node, step = queue.popleft() x, y = node // 8, node % 8 if node == end: return step for i in range(8): nx, ny = x + dx[i], y + dy[i] if 0 <= nx < 8 and 0 <= ny < 8: next_node = nx * 8 + ny if not visited[next_node]: visited[next_node] = True queue.append((next_node, step + 1)) return -1 start = 0 end = 17 print(bfs(start, end)) # 输出3 ``` 在上面的代码中,start和end分别表示起点和终点的位置,这里以(0, 0)和(2, 1)为例。bfs函数返回从起点到终点的最短步数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值