廣度優先搜尋解決八數碼問題

2021-10-14 06:01:19 字數 2142 閱讀 8760

//程式描述:基於盲目搜尋策略的寬度優先搜尋方法

#include #include #include #include #include #include #include using namespace std;

#define n 9 //九宮格總數字

//陣列定義:0~9階乘定義

const int jc[n + 1] = ; //0-9的階乘

//陣列定義,移動規則(分別對應空格右移、下移、上移、左移)

const int zero_move[4][2] = , ,, };

//結構體定義:狀態結構體

typedef struct status

node;

//函式功能:康托展開

//函式引數:某一狀態序列

//函式返回:康托展開值

int cantor(int arr[n])

sum += (nmin * jc[n - i - 1]);

}return sum;

}//函式功能:交換陣列

void swap(int* array, int i, int j)

//函式功能:以矩陣形式列印狀態陣列

void printarray(int* array)

cout << endl;

}//函式功能:複製陣列

void copyarray(int source[n], int target[n])

}//vectorvec_node;

//函式功能:寬度優先搜尋

//函式引數:初始狀態陣列,源狀態雜湊索引,目標狀態雜湊索引

//函式返回:搜尋步數(空格移動次數)

int bfs(int array_source[n], int source_hash, int target_hash)

//初始化當前狀態結構體

now_status.hash = source_hash;

now_status.pos = pos;

now_status.step = 0;

next_status.step = 0;

//把當前結點放入open表中

vec_node.push_back(now_status);

queue_open.push(vec_node);

sethash.insert(now_status.hash);

while (!queue_open.empty())

printf("%ld\n", vec_node.size());

return next_status.step;

}if (end > begin)

vec_node.pop_back();}}

}return -1;

}//函式功能:求逆序數

//函式引數:表示狀態的數字序列

int inversion(int array[n])}}

return sum;

}//主程式入口

int main()

else

if (str_target.at(i) >= '0' && str_target.at(i) <= '8')

else

}//源狀態雜湊和目標狀態雜湊

int shash, thash;

shash = cantor(array_source);

thash = cantor(array_target);

// printf(" %d,%d\n",shash,thash);

// printarray(array_source);

// printarray(array_source);

//求初始狀態和目標狀態的逆序數

int inver_source = inversion(array_source);

int inver_target = inversion(array_target);

//具有同奇或同偶排列的八數碼才能移動可達,否則不可達

if ((inver_source + inver_target) % 2 == 0)

{int step = bfs(array_source, shash, thash);

cout << "從初始狀態到目標狀態空格0的最小移動步數為:"《參考了部落格

廣度優先搜尋 八數碼問題

給定乙個一幅圖和乙個起點s,回答 從s到給定的頂點v是否存在一條路徑?如果有,找出其中最短的那條 所含邊數最少 邊數最少,很自然想到從從經過1條邊能到達的節點有哪些?然後經過這些邊再到達的節點有哪些?這樣我不就能夠想出來最短的路徑了嗎?沒錯,這是非常簡單的想法,然而真正的廣度優先演算法也是這樣,簡單...

八數碼問題(bfs廣度優先搜尋)

最近在學bfs,覺得這個題不錯,自己沒做出來,去網上搜了一下,又結合了我自己的想法,ac了 這個看起來用dfs比較好做,但是會超時好像,所以肯定用bfs了。問題描述 在九宮格裡放在1到8共8個數字還有乙個是x,與x相鄰的數字可以移動到x的位置,問給定的狀態最少需要幾步能到達目標狀態 1 2 3 4 ...

深度優先搜尋 廣度優先搜尋(解決小哈)

問題省略 思路 讓小哼往右邊走,直到走不通的時候再回到這裡,再去嘗試另乙個方向。規定乙個順序,按順時針方向來嘗試 即按照右 下 左 上的順序去嘗試 先 檢查小哼是否已經到達小哈的位置,如果沒有到達則找出下一步可以走的地方。為了解決這個問題,此處dfs 函式只需要維護3個引數,分別是x座標 y座標 以...