八方塊移動遊戲要求從乙個含8個數字(用1-8表示)的方塊以及乙個空格方塊(用0表示)的3x3矩陣的起始狀態開始,
不斷移動該空格方塊以使其和相鄰的方塊互換,直至達到所定義的目標狀態。
空格方塊在中間位置時有上、下、左、右4個方向可移動,在四個角落上有2個方向可移動,在其它位置上有3個方向可移動。
例如,假設乙個3x3矩陣的初始狀態為:
8 0 3
2 1 4
7 6 5
要求的目標狀態為:
1 2 3
8 0 4
7 6 5
則乙個合法的移動路徑為:
8 0 3 8 1 3 8 1 3 0 1 3 1 0 3 1 2 3
2 1 4 => 2 0 4 => 0 2 4 => 8 2 4 => 8 2 4 => 8 0 4
7 6 5 7 6 5 7 6 5 7 6 5 7 6 5 7 6 5
另外,在所用可能的從初始狀態到目標狀態的移動路徑中,步數最少的路徑被稱為最短路徑;
在上面的例子中,最短路徑為5。如果不存在從初始狀態到目標狀態的任何路徑,則稱該組狀態無解。
請設計演算法找到從八方塊的某初始狀態到某目標狀態的所有可能路徑的最短路徑
#define win32_lean_and_mean
#define _crt_secure_no_deprecate
#include
#include
#include
#include
#include
#include
const unsigned int strlength = 9;
using
namespace std;
// 交換字串src中 x和y的值,返回被交換後的新串
char* swap(char* src, int x, int y)
//為map提供的比較函式.用於比較字串值,取代預設的比較字串位址
struct ltstr
};//核心演算法,start為初始狀態 goal為目標狀態
//沒有使用a* 演算法 或啟發式尋找 我在這個題目中,我找不到這樣的啟發條件.
//我覺的啟發式並不一定能得到最優解 這題明確要求是最短路徑
//用隊來實現廣度優先 用map來儲存所有節點.實現圖的效果 map中每項資料由《節點,節點的父節點》構成
//返回值為兩種狀態需要的最短步數.
int findstep(char* start, char* goal)
//如果此結點不是目標狀態節點則入隊,並將此節點加入圖中
if (strcmp(generate[i], goal) != 0)
strmap.insert(make_pair(generate[i], str));
char *back = generate[i];
//執行到這裡則說明此結點為目標狀態結點遁環查詢其父結點
while (strcmp(back, start) != 0)
//釋放記憶體 並返回步數;
for (iter = strmap.begin(); iter != strmap.end(); iter++)
delete iter->first;
return step;}}
//目標狀態不可到達 釋放記憶體 返回-1;
for (iter = strmap.begin(); iter != strmap.end(); iter++)
delete iter->first;
return -1;
}int main()
百度之星 2019 決賽遊記
咕咕咕。先是簡單的開幕式,郭老又來了。今年的比賽題目是給你乙個神經網路的計算圖,所有計算節點都跑在乙個裝置上,1併發 所有通訊節點都跑在另乙個裝置上,3併發,要求給乙個拓撲序,使得執行完的時間盡量短。今年提供自定義測試,終於不會像去年那樣第一輪爆零直接跑路了。先隨便求了個類似最長路的東西然後直接按照...
百度之星2021決賽遊記
之前的複賽跌跌撞撞打到了rank23,順利進入到了決賽,左等右等終於在新年伊始迎來了決賽,雖然仍然是線上。比賽前夕官方組建了大賽群,讓我得以正式認識了參賽選手們。佔選手絕大部分的自然是已經在oi中功成名就的競賽生們,他們有的是往年的國家隊選手,有的是已經步入高三 大學的集訓隊選手。望著那乙個個我曾在...
2005「百度之星」程式設計大賽網上決賽試題
第一題 共兩題100分 站點統計 50分 題目描述 s 1 2 3 4 1 4 0 3 2 3 4 5 3 2 2 2 4 6 1 4 其中與s site 同行和同列的數字都表示站點號,其他每個數字表示乙個站點到另乙個站點的超文字鏈結數。如果站點a有到另乙個站點b的直接鏈結或間接 指通過乙個或多個直...