題目大意:
你 的乙個朋友正在研究騎士巡遊問題, 你的問題在於找到兩個方格之間移動的最小步數,一旦您解決了這個問題 ,找到你的旅行方式就會變的簡單
你的工作時寫乙個程式,方格 a b 作為輸入 決定a 到 b 最少的步數
輸入:輸入會有多組測試 ,魅族測試 一行 表示兩個方格位置 並且用 空格分開 每個 方格由子字母和數字組成
輸出:輸出格式為:to get from xx to yy takes n knight moves.".
解題思路: 一看這道題會想棋盤搜尋 ,記錄步數,是搜尋題 搜尋有身搜和廣度搜尋,好像兩種都可以
這裡解釋下深度優先搜尋的概念 :
dfs: 深度優先搜尋 的演算法 是沿著樹的深度一直遍歷 盡可能深的搜尋樹的分支 ,當節點 v的所有邊的都已經 被搜尋過 ,那麼回溯 發現v的那條邊的起始節點
這一過程 ,一直進行到 已經發現從源節點到 所有節點為止, 如果還存在未發現的節點 ,那麼 選擇其中的乙個作為源節點 並且重複以上過程 , 直到所有的節點 都搜尋完為止,典型的盲目搜尋。。。。
bfs: 廣度優先搜尋 演算法從任意節點v 開始 依次搜尋其中乙個可以擴充套件的每乙個節點 當一層節點 全部搜尋完 ,然後往下搜尋 下乙個可擴充套件的所有節點,知道所有 均被訪問, 可以看出 他是訪問每一層 ,每一層先訪問完然後先彈出 訪問下一層 ,先進先出 ,要利用佇列 進行實現
下面用廣度優先解題:
使用佇列:
#include#include#include#includeusing namespace std;
struct ss
;int main()
; int dy[8] = ;
int dis[8][8];
char st[8];
char en[8];
int i ;
while(scanf("%s %s", st,en))
{ss start ;
ss end;
memset(dis, -1, sizeof(dis)); //來標記是否走過
start.x = st[0] - 'a';
start.y = st[1] -'1';
end.x = en[0] - 'a';
end.y = en[1] - '1';
//下面採用寬度優先遍歷的方式進行求解
dis[start.x][start.y] = 0;
queueq;
q.push(start); //進隊操作
ss nex , tmp;
if(start.x == end.x && start.y == end.y)
{cout<<"to get from "<
14 4 選單功能
選單功能就是與使用者的溝通介面。1 在workermanager.h標頭檔案中新增show menu 成員函式。class workermanager 2 在workermanager.cpp中實現show menu 成員函式。其實這個函式就是在螢幕中把選單介面列印出來,沒什麼技術含量。顯示選單 v...
HOJ刷題筆記
首次看題真的一臉懵逼,什麼鬼,這是要我們幹嘛。然後我們看到題目的輸入與輸出就會發現就是先規定乙個固定大小的收納字串的空間,然後再將出現最多的字串輸出就好了。弄懂了題目就會發現這道題目很簡單了。直接暴力求解,將字串轉換為乙個乙個數字元素,然後再對其進行計數,最後將最大數對應的字串輸出,然後有一種特殊情...
14 4 執行緒的通訊
執行緒通訊 乙個執行緒完成自己的任務時,就要通知另外乙個執行緒去 例子就是生產者與消費者關係 wait 等待。如果執行緒執行了wait方法,那麼該執行緒會進入等待的狀態 notify 喚醒等待的執行緒 注意 1 wait和notify方法是屬於objeck類的。2 wait和notify方法必須是要...