馬的遍歷問(wèn)題(打印訪問(wèn)象棋棋盤(pán)所有位置需要的步數(shù))

1、環(huán)境配置:

  • 系統(tǒng):win10
  • 編程語(yǔ)言:C
  • 編譯器:DevC++

2、算法思想:

馬的遍歷問(wèn)題,就是希望在一個(gè)規(guī)定大小的棋盤(pán)(M*N)上面,馬從第(x,y)點(diǎn)出發(fā),一直遍歷所有的點(diǎn),打印出訪問(wèn)某一個(gè)點(diǎn)所需要的步數(shù)。按照規(guī)則馬能夠跳躍的方向有8種可能(如下圖所示):


馬的遍歷.png

3、代碼:

#include <stdio.h>

void F_1(int a[10][9],int i,int j,int r,int l,int n); //r為二維數(shù)組行數(shù),l為二維數(shù)組列數(shù),n為訪問(wèn)次數(shù),默認(rèn)傳1 

int main(){
    int A[10][9];
    int B[3][3];
    //二維數(shù)組初始化 
    for(int i=0;i<10;i++){
        for(int j=0;j<9;j++){
            A[i][j]=-1;
        }
    }
    //打印二維數(shù)組
    for(int i=0;i<10;i++){
        for(int j=0;j<9;j++){
            printf("%d ",A[i][j]); 
        }
        printf("\n");
    } 
    
    F_1(A,0,7,10,9,1);
    
    printf("\n");
    //打印二維數(shù)組
    for(int i=0;i<10;i++){
        for(int j=0;j<9;j++){
            if(A[i][j]!=-1)
            {
                printf(" %d ",A[i][j]); 
            }
            else{
                printf("%d ",A[i][j]); 
            }
        }
        printf("\n");
    } 
    
    return 0;
}


//遍歷棋盤(pán)函數(shù)F_1 
void F_1(int a[10][9],int i,int j,int r,int l,int n)
{
    //起始點(diǎn)初始化
    if(n==1){
        a[i][j]=0;
    } 
    //先訪問(wèn)1點(diǎn)
    if(((i-2>-1)&&(i-2<r))&&((j+1>-1)&&(j+1<l))){
        if((a[i-2][j+1]==-1)||(n<a[i-2][j+1])){
            a[i-2][j+1]=n;
            F_1(a,i-2,j+1,r,l,n+1);
        }
    }
    //再訪問(wèn)2點(diǎn)
    if(((i-1>-1)&&(i-1<r))&&((j+2>-1)&&(j+2<l))){
        if((a[i-1][j+2] == -1)||(n<a[i-1][j+2])){
            a[i-1][j+2]=n;
            F_1(a,i-1,j+2,r,l,n+1); 
        }
    }
    //再訪問(wèn)3點(diǎn)
    if(((i+1>-1)&&(i+1<r))&&((j+2>-1)&&(j+2<l))){
        if((a[i+1][j+2] == -1)||(n<a[i+1][j+2])){
            a[i+1][j+2]=n;
            F_1(a,i+1,j+2,r,l,n+1); 
        }
    }
    //再訪問(wèn)4點(diǎn)
    if(((i+2>-1)&&(i+2<r))&&((j+1>-1)&&(j+1<l))){
        if((a[i+2][j+1] == -1)||(n<a[i+2][j+1])){
            a[i+2][j+1]=n;
            F_1(a,i+2,j+1,r,l,n+1); 
        }
    }
    //再訪問(wèn)5點(diǎn)
    if(((i+2>-1)&&(i+2<r))&&((j-1>-1)&&(j-1<l))){
        if((a[i+2][j-1] == -1)||(n<a[i+2][j-1])){
            a[i+2][j-1]=n;
            F_1(a,i+2,j-1,r,l,n+1); 
        }
    }
    //再訪問(wèn)6點(diǎn)
    if(((i+1>-1)&&(i+1<r))&&((j-2>-1)&&(j-2<l))){
        if((a[i+1][j-2] == -1)||(n<a[i+1][j-2])){
            a[i+1][j-2]=n;
            F_1(a,i+1,j-2,r,l,n+1); 
        }
    }
    //再訪問(wèn)7點(diǎn)
    if(((i-1>-1)&&(i-1<r))&&((j-2>-1)&&(j-2<l))){
        if((a[i-1][j-2] == -1)||(n<a[i-1][j-2])){
            a[i-1][j-2]=n;
            F_1(a,i-1,j-2,r,l,n+1); 
        }
    }
    //再訪問(wèn)8點(diǎn)
    if(((i-2>-1)&&(i-2<r))&&((j-1>-1)&&(j-1<l))){
        if((a[i-2][j-1] == -1)||(n<a[i-2][j-1])){
            a[i-2][j-1]=n;
            F_1(a,i-2,j-1,r,l,n+1); 
        }
    }
        
}

4、結(jié)果展示:

結(jié)果1.png
結(jié)果2.png

5、反思總結(jié):

  • 偽代碼如下:
void init(a[m][n])//將a[m][n]初始化為值全部為“-1”的二維數(shù)組 
void F(int a[m][n],int i,int j,int r,int l,int n)////r為二維數(shù)組行數(shù),l為二維數(shù)組列數(shù),n為訪問(wèn)次數(shù),默認(rèn)傳1 。
{
    //起始位置初始為0
    if(n==1) then a[i][j]=0;
    //訪問(wèn)位置1 
    if(r>(i-2)>-1&&l>(j+1)>-1) then{
        if((a[i-2][j+1]==-1)||(n<a[i-2][j+1])) then{
            a[i-2][j+1]=n;
            F_1(a,i-2,j+1,n+1);
        }
    }
    //訪問(wèn)位置2 
    if(r>(i-1)>-1&&l>(j+2)>-1) then{
        if((a[i-1][j+2]==-1)||(n<a[i-1][j+2])) then{
            a[i-1][j+2]=n;
            F_1(a,i-1,j+2,n+1);
        }
    }
    //訪問(wèn)位置3 
    if(r>(i+1)>-1&&l>(j+2)>-1) then{
        ... 
    }
    //訪問(wèn)位置4 
    if(r>(i+2)>-1&&l>(j+1)>-1) then{
        ... 
    }
    //訪問(wèn)位置5 
    if(r>(i+2)>-1&&l>(j-1)>-1) then{
        ... 
    }
    //訪問(wèn)位置6 
    if(r>(i+1)>-1&&l>(j-2)>-1) then{
        ... 
    }
    //訪問(wèn)位置7 
    if(r>(i-1)>-1&&l>(j-2)>-1) then{
        ... 
    }
    //訪問(wèn)位置8
    if(r>(i-2)>-1&&l>(j-1)>-1) then{
        ... 
    } 
} 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、環(huán)境配置: 系統(tǒng):win10 編程語(yǔ)言:C++ 編譯器:DevC++ 2、問(wèn)題描述: 簡(jiǎn)單的0/1背包問(wèn)題:設(shè)...
    疋瓞閱讀 1,098評(píng)論 0 1
  • 1、環(huán)境配置: 系統(tǒng):win10 編程語(yǔ)言:C++ 編譯器:DevC++ 2、算法思想: 以數(shù)組中第一個(gè)元素為標(biāo)準(zhǔn)...
    疋瓞閱讀 355評(píng)論 0 1
  • 1、環(huán)境配置: 系統(tǒng):win10 編程語(yǔ)言:C 編譯器:DevC++ 2、算法思想: 分治:先分,后治! 注意:在...
    疋瓞閱讀 430評(píng)論 0 1
  • 1、環(huán)境配置: 系統(tǒng):win10 編程語(yǔ)言:C 編譯器:DevC++ 2、算法思想: 1、先把三個(gè)數(shù)組A,B,C從...
    疋瓞閱讀 916評(píng)論 0 1
  • 1、環(huán)境配置: 系統(tǒng):win10 編程語(yǔ)言:C++ 編譯器:DevC++ 2、算法思想: 簡(jiǎn)化步驟,將問(wèn)題看成是把...
    疋瓞閱讀 1,476評(píng)論 0 0

友情鏈接更多精彩內(nèi)容