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{
...
}
}