c++习题求大神解答 25

设有一个n*m的棋盘(2≤n≤50,2≤m≤50),。在棋盘上任一点有一个中国象棋马,马走的规则为:1.马走日字2.马只能向右走问题:当n,m输入之后,从最左下角走到最右... 设有一个n*m的棋盘(2≤n≤50,2≤m≤50),。在棋盘上任一点有一个中国象棋马,马走的规则为: 1.马走日字 2.马只能向右走
问题:当n,m 输入之后,从最左下角走到最右上角,即从(1,1)走到(n,m),所需的步数最少是多少。若不存在路径,则输出"no"
输入
6 5

输出
3
输入
4 4

输出
2
展开
 我来答
来自敬亭山暗香袭人的狮子
2017-09-05
知道答主
回答量:25
采纳率:0%
帮助的人:4.8万
展开全部

这道题用bfs做就行了,bfs是广度优先搜索,不清楚的话可以去学习一下,主要的思路就是把马可以走的下两步加入到一个队列中,直到有一步走到了(n, m)点,记录ans并return,此时的ans就是最少的步数。

代码:

#include <set>
#include <map>
#include <queue>
#include <cmath>
#include <vector>
#include <cctype>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
using namespace std;
const int MX = 50 + 5;
const int INF = 1e9 + 5;
int n, m, ans;
int vis[MX][MX];
int go[][2] = {1, 2, 2, 1};
struct node{
    int x, y, cnt;
}now, nxt;
void bfs(){
    queue<node> q;
    now.x = 1;
    now.y = 1;
    now.cnt = 0;
    vis[now.x][now.y] = 1;
    q.push(now);
    while(!q.empty()){
        now = q.front();
        q.pop();
        if(now.x == n && now.y == m){
            ans = now.cnt;
            return ;
        }
        for(int i = 0; i < 2; i++){
            nxt.x = now.x + go[i][0];
            nxt.y = now.y + go[i][1];
            nxt.cnt = now.cnt + 1;
            if(vis[nxt.x][nxt.y] || nxt.x > n || nxt.y > m) continue;
            q.push(nxt);
            vis[nxt.x][nxt.y] = 1;
        }
    }
}
int main(){
    scanf("%d%d", &n, &m);
    bfs();
    cout << ans << endl;
    return 0;
}
编程大王
2017-09-02 · TA获得超过922个赞
知道小有建树答主
回答量:979
采纳率:51%
帮助的人:114万
展开全部
哈哈,后面也是你问的?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式