最少步数(bfs)

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

【输入】
A、B两点的坐标。

【输出】
最少步数。

【输入样例】
12 16
18 10
【输出样例】
8
9
题目分析:
作为广搜的初学者,我认为对一个题深入理解很有必要,最好深入到题的每一个细节以及代码实现的每一步处理方式。
而对这个题最后把我困住的是最少步数的求法,都说广搜来求最优解,在这个题上我算是彻底明白了,我选择了用一个数组来储存到达每个点的最少步数。
例如:minx[i][j]就表示从起点到(i,j)的最少步数。
代码:

#include<iostream>
#include<queue>
using namespace std;
int ax,ay,bx,by;
int tu[101][101];//判断有没有到过这个点
int d[12][2]={2,1,2,-1,1,2,1,-2,-2,1,-2,-1,-1,2,-1,-2,2,2,2,-2,-2,2,-2,-2};//十二个方向
int minx[101][101];//到达(i,j)的最少步数
void bfs(int ,int);//搜索函数
void print();//输出函数
int main()
{
    cin>>ax>>ay;
    cin>>bx>>by;
    tu[ax][ay]=1;//把起点赋值表示到过
    bfs(ax,ay);
    for(int i=1;i<=100;i++)
        for(int j=1;j<=100;j++)
        tu[i][j]=0;
    for(int i=1;i<=100;i++)
        for(int j=1;j<=100;j++)
        minx[i][j]=0;
    tu[bx][by]=1;
    bfs(bx,by);
    return 0;
}
void print()
{
    cout<<minx[1][1]<<endl;
}
void bfs(int x,int y)
{
    queue<int>nx,ny;
    nx.push(x);//起点入队
    ny.push(y);
    while(!nx.empty()&&!ny.empty())//队列非空时执行
    {
        for(int i=0;i<12;i++)//十二个方向
        {
            int xx=nx.front()+d[i][0];//选择跳跃方向
            int yy=ny.front()+d[i][1];
            if(!tu[xx][yy]&&xx>0&&xx<=100&&yy>0&&yy<=100)//判断越界以及是否到过
            {
                nx.push(xx);
                ny.push(yy);
                tu[xx][yy]=1;
                minx[xx][yy]=minx[nx.front()][ny.front()]+1;//最少步数等鱼上一步加一
                if(xx==1&&yy==1)//第一次到达目的地即为最少步数
                {
                    print();return;
                }
            }
        }
        nx.pop();//出队
        ny.pop();
    }
}
输入:
12 16
18 10
输出:
8
9

Process returned 0 (0x0)   execution time : 6.220 s
Press any key to continue.

最后还想说如果真的把这个题弄透的话对于像我一样的初学者来说真的能学到的东西不少!

发布了42 篇原创文章 · 获赞 42 · 访问量 9326

猜你喜欢

转载自blog.csdn.net/amazingee/article/details/104163234