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數碼問題。書上並未給出答案,我當時用不同的搜尋策略分別實現了程式求解,但是普遍效率不高。這兩天閒來無事,再把以前的程...