1330:【例8.3】最少步数(BFS)

【题目描述】
在各种棋中,棋子的走法总是一定的,如中国象棋中马走“日”。有一位小学生就想如果马能有两种走法将增加其趣味性,因此,他规定马既能按“日”走,也能如象一样走“田”字。他的同桌平时喜欢下围棋,知道这件事后觉得很有趣,就想试一试,在一个(100×100)的围棋盘上任选两点A、B,A点放上黑子,B点放上白子,代表两匹马。棋子可以按“日”字走,也可以按“田”字走,俩人一个走黑马,一个走白马。谁用最少的步数走到左上角坐标为(1,1)的点时,谁获胜。现在他请你帮忙,给你A、B两点的坐标,想知道两个位置到(1,1)点可能的最少步数。
【输入】
A、B两点的坐标。
【输出】
最少步数。
【输入样例】
12 16
18 10
【输出样例】
8
9

先把初始值放入队里,然后执行一遍12种路径,如果还未达到目的,就把每一种情况都拿出来都往下执行一遍

#include <iostream>
#include <queue>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;

int x[12]={-2,-1,-2,-2,-1,-2,2,1,2,2,1,2};
int y[12]={-1,-2,-2,1,2,2,-1,-2,-2,1,2,2};
int n1,n2,m1,m2,r,l,st;
int v[105][105];
struct node
{
    int xx,yy,step;
};

void bfs(int xx,int yy)
{
    queue<node>q;
    memset(v,0,sizeof(v));
    node s,ss;
    s.xx=xx;
    s.yy=yy;
    s.step=0;
    q.push(s);//赋初始值
    while(!q.empty())
    {
        s=q.front();//取队首元素
        q.pop();//删除队首元素
        for(int i=0;i<12;i++)//12种移动方式全部执行一遍
        {
            r=s.xx+x[i];
            l=s.yy+y[i];
            if(r<=100&&r>0&&l<=100&&l>0&&v[r][l]==0)//符合条件且未走过
            {
                v[r][l]=1;//标记走过
                ss.xx=r;
                ss.yy=l;
                ss.step=s.step+1;
                q.push(ss);//放入移动后的信息
                if(r==1&&l==1)
                {
                    cout<<s.step+1<<endl;
                    return ;
                }
            }
        }
    }
}
int main()
{
	cin>>n1>>m1;
    cin>>n2>>m2;
    bfs(n1,m1);
    bfs(n2,m2);
	return 0;
}

通过一个题理解暴搜

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值