//程式描述:基於盲目搜尋策略的寬度優先搜尋方法
#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座標 以...