8數碼問題

2021-06-07 12:13:17 字數 891 閱讀 1665

8數碼問題,即在乙個3×3的矩陣中有8個數(1至8)和乙個空格,從乙個狀態轉換到另乙個狀態,每次只能移動與空格相鄰的乙個數字到空格當中

aoj-417-8數碼

這題是求轉化的最少步數,可用bfs解決,共有9!=362880種情況,關鍵是如何標記已經訪問過的狀態,保證每次搜尋得到的狀態都是最小的步數,這裡可將字串轉化成對應的整數來處理,可用康托展開來節省儲存空間

康托展開: x=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0! 

ai為在當前未出現的數字中是排在第幾個(0<=ai

#include#include#includechar a[363000][9]; //共有9!=362880種情況,用char儲存節省空間

char goal[9];

char visit[363000];

int dis[363000];

int dir[4][2]=,,,};

int c[9]=;

int find(char str[9]) //將字串轉換成乙個整數

,,,};

char name[4]=;

int c[9]=;

void init()

int find(char str[9]) //將字串轉換成乙個整數

for(i=0;i<9;i++) //找到0所在位置

if(a[head][i]==0)

for(i=0;i<4;i++)

}} head++;

} return -1;

}int main()

{ int i,k,ans;

char ss[50];

k=0;

gets(ss);

for(i=0;i

8數碼問題 深搜 廣搜

8數碼問題的廣搜在網上可以找到 廣搜一般可以找到最優解,但是深搜不一定能找到最優解。一般的深搜多是指定最大遞迴深度的深搜,一般情況下,問題解的深度很難確定。因此深蒐會出現三種情況,一是找到最優解,二是在迭代深度內找不到解,三是找到解但不是最優解。第一種情況自然是最好的,不過較經常出現的是第三種,在指...

廣度優先搜尋 經典的8數碼問題

話不多說,直接貼 吧 廣度搜尋 8數碼問題 include include using namespace std const int max 8 const int all 363000 總的個數有9!362880,故取363000 int fac max 康托展開需要用到的工具 char a a...

8數碼問題的C 解決方案

引子 我接觸8數碼問題是在研一的時候上的 人工智慧 課上,在某一章節介紹完深度優先搜尋 廣度優先搜尋 貪婪搜尋 a 搜尋四種經典搜尋策略以後,章節後面的一道習題便是讓學生程式設計求解8數碼問題。書上並未給出答案,我當時用不同的搜尋策略分別實現了程式求解,但是普遍效率不高。這兩天閒來無事,再把以前的程...