UVA-439(Knight Moves)

UVA-439(Knight Moves)

题目:
https://cn.vjudge.net/problem/UVA-439

代码如下:

#include<bits/stdc++.h>
using namespace std;
#define MAX 11

string s1,s2;
int a1,a2,b1,b2;
int direction [8][2] = {{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2},{2,-1}};//一个点走向其它点的不同可能
int vis[MAX][MAX];//用于判重
struct Node     //每个结点里有点的横纵坐标以及到达这个点所需步数
{
    int x,y,step;
    Node(int xx,int yy,int step1):x(xx),y(yy),step(step1){}
};

int bfs()
{
    int dx,dy;
    memset(vis,1,sizeof(vis));
    queue<Node> p;
    p.push(Node(a1,b1,0));
    vis[a1][b1] = 0;
    while(!p.empty())
    {
        Node head = p.front();
        p.pop();
        if(head.x == a2 && head.y == b2) return head.step;
        for(int i = 0;i < 8;i++)
        {
            dx = head.x + direction[i][0];
            dy = head.y + direction[i][1];
            if(dx > 0 && dx <= 8 && dy > 0 && dy <= 8 && vis[dx][dy])
            {
                vis[dx][dy] = 0;
                p.push(Node(dx,dy,head.step + 1));
            }
        }
    }
    return -1;
}

int main()
{
    while(cin >> s1 >> s2)
    {
        a1 = s1[0] - 'a' + 1;
        b1 = s1[1] - '0';
        a2 = s2[0] - 'a' + 1;
        b2 = s2[1] - '0';
        cout << "To get from " << s1 << " to " << s2 << " takes " << bfs() << " knight moves." << endl;
    }
    return 0;
}

分析:
首先把输入的字符全部转换为数字,然后定义一个结构体,每个结构体都代表一个点的横纵坐标以及到达这个点的步数,在进行bfs操作的时候,首先把每个点都重置为1(也就是把每个点都重置为新点),同样也定义一个队列只不过队列中的元素是结构体Node,随后把起点Node入队,然后把这个点赋值0(此时这个点就是旧点了)。随后列举这个点可以走向别的点的可能,如果到达的点是新点且不越界那就入队,入队后这个点就变为旧点且步数加1。
另外每次出队的时候都需要判断这个点是否为终点,如果是的则输出这个点的step,如果不是则继续。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值