最少步數(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.

最後還想說如果真的把這個題弄透的話對於像我一樣的初學者來說真的能學到的東西不少!

發佈了31 篇原創文章 · 獲贊 27 · 訪問量 8759
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章