A 演算法解決八數碼問題(C 類改進版)

2021-08-19 17:32:10 字數 3387 閱讀 1413

八數碼問題:

在乙個3*3的棋盤中,分別用1,2,3,...,8表示八個數碼方格,用0表示空缺的方格,現給出乙個初始狀態和目標狀態,尋找出在評估函式f(n)=g(n)+h(n)的限制下,以最少的步數到達目標狀態(一次將乙個數碼方格移動到空缺的方格中);其中,g(n)表示n節點與目標狀態的「距離」,h(n)表示n節點與初始狀態的距離。

現在令g(n)為當前節點n與目標狀態數碼方格位置不同的個數,h(n)為節點的深度。

定義node類:

class node

int dis();//計算並返回distances

void voluation(int index);//賦值為v[index]

bool isend();//是否為目標狀態

bool isequal(node q);//當前節點和節點q是否相等

};

定義全域性:

vector v;//使用vector儲存節點

node father,intent;//定義初始狀態和目標狀態

類外定義函式:

void node::voluation(int index)

}if(index_x<2)

}if(index_y>0)

}if(index_y<2)

}v[index].distances=maxnum;//v[idnex]已擴充套件完畢,設為不可「訪問」點

}

void print(int index, vector& rstep_v)//利用rstep_v輸出從index到達目標節點的過程

for (int i = rstep_v.size() - 1; i >= 0; i--)

else

} if(t)//已到達目標狀態,退出迴圈

break;

}}

完整**如下:

#include #include #include #define col 3

#define row 3

#define maxnum 10000

#define maxdistance 10000

using namespace std;

class node

int dis();

void voluation(int index);

bool isend();

bool isequal(node q);

};vector v;

node father,intent;

void node::voluation(int index)

}if(index_x<2)

}if(index_y>0)

}if(index_y<2)

}v[index].distances=maxnum;

}ostream& operator<

return os;}

void print(int index, vector& rstep_v)

for (int i = rstep_v.size() - 1; i >= 0; i--)

else

} if(t)

break; }}

int main()

}father.findex=0;

father.depth=0;

cout << "input end:" << endl;

for(int i=0;i>intent.number[i][j];}}

v.push_back(father);

process();

return 0;

}

執行結果:

input source:

1 2 3 4 5 6 7 8 0

input end:

1 0 2 3 4 5 6 7 8

step 1

down

1 2 3

4 5 0

7 8 6

step 2

right

1 2 3

4 0 5

7 8 6

step 3

right

1 2 3

0 4 5

7 8 6

step 4

up1 2 3

7 4 5

0 8 6

step 5

left

1 2 3

7 4 5

8 0 6

step 6

left

1 2 3

7 4 5

8 6 0

step 7

down

1 2 3

7 4 0

8 6 5

step 8

down

1 2 0

7 4 3

8 6 5

step 9

right

1 0 2

7 4 3

8 6 5

step 10

up1 4 2

7 0 3

8 6 5

step 11

up1 4 2

7 6 3

8 0 5

step 12

right

1 4 2

7 6 3

0 8 5

step 13

down

1 4 2

0 6 3

7 8 5

step 14

left

1 4 2

6 0 3

7 8 5

step 15

left

1 4 2

6 3 0

7 8 5

step 16

up1 4 2

6 3 5

7 8 0

step 17

right

1 4 2

6 3 5

7 0 8

step 18

right

1 4 2

6 3 5

0 7 8

step 19

down

1 4 2

0 3 5

6 7 8

step 20

left

1 4 2

3 0 5

6 7 8

step 21

down

1 0 2

3 4 5

6 7 8

A 演算法解決八數碼問題(C 版本)

八數碼問題也稱為九宮問題。在3 3的棋盤,擺有八個棋子,每個棋子上標有1至8的某一數字,不同棋子上標的數字不相同。棋盤上還有乙個空格,與空格相鄰的棋子可以移到空格中。要求解決的問題是 給出乙個初始狀態和乙個目標狀態,找出一種從初始轉變成目標狀態的移動棋子步數最少的移動步驟。關鍵之處 要維護兩個結構 ...

A A 演算法解決八數碼問題(C 實現)

1.狀態圖搜尋 1.1搜尋樹 搜尋過程中經過的節點和邊按原圖的連線關係構成乙個樹型的有向圖,稱為搜尋樹。1.2搜尋方式 樹式搜尋 記錄搜尋過程中所經過的所有節點和邊 1.3路徑的獲得 樹式搜尋 反向求解 2.搜尋演算法 2.1 closed表和open表 closed表對樹式搜尋來說儲存的是正在成長...

演算法篇 14 A 演算法解決八數碼問題

八數碼問題 在3 3的方格棋盤上,擺放著1到8這八個數碼,有1個方格是空的,其初始狀態如圖1所示,要求對空格執行空格左移 空格右移 空格上移和空格下移這四個操作使得棋盤從初始狀態到目標狀態。a 初始狀態 b 目標狀態 a 演算法實際是一種啟發式搜尋,所謂啟發式搜尋,就是利用乙個估價函式評估每次決策的...