LeeCode 773 滑動謎題

2021-09-30 20:12:19 字數 2175 閱讀 4906

在乙個 2 x 3 的板上(board)有 5 塊磚瓦,用數字1~5來表示, 以及一塊空缺用0來表示.

一次移動定義為選擇0與乙個相鄰的數字(上下左右)進行交換.

最終當板board的結果是[[1,2,3],[4,5,0]]謎板被解開。

給出乙個謎板的初始狀態,返回最少可以通過多少次移動解開謎板,如果不能解開謎板,則返回 -1 。

示例:

輸入:board = [[1,2,3],[4,0,5]]輸出:1解釋:交換 0 和 5 ,1 步完成
輸入:board = [[1,2,3],[5,4,0]]輸出:-1解釋:沒有辦法完成謎板
輸入:board = [[4,1,2],[5,0,3]]輸出:5解釋:最少完成謎板的最少移動次數是 5 ,

一種移動路徑:

尚未移動: [[4,1,2],[5,0,3]]

移動 1 次: [[4,1,2],[0,5,3]]

移動 2 次: [[0,1,2],[4,5,3]]

移動 3 次: [[1,0,2],[4,5,3]]

移動 4 次: [[1,2,0],[4,5,3]]

移動 5 次: [[1,2,3],[4,5,0]]

輸入:board = [[3,2,4],[1,5,0]]輸出:14

這道題可以將每乙個狀態的broad 用乙個六位數p表示,再將滑動次數 * 1000000加上p記為乙個狀態,用p的不同判斷狀態的不同,然後用bfs即可:

//773 -- 13ms -- 80.00%

public int slidingpuzzle(int board)

}queueq = new arraydeque<>();

setset = new hashset<>();

q.add(b);

int k = 0;

while (!q.isempty())

if (t == r1)

int i = 6;

int tt = t;

while (tt / 10 * 10 != tt)

switch (i)

newp = t - t % 100 + t % 100 / 10;

if(!set.contains(newp))

break;

}case 5:

newp = t - t / 100 % 10 * 90;

if(!set.contains(newp))

newp = t + t % 10 * 9;

if(!set.contains(newp))

break;

}case 4:

newp = t + t / 10 % 10 * 90;

if(!set.contains(newp))

break;

}case 3:

newp = t - t % 10 + t % 10 * 1000;

if(!set.contains(newp))

break;

}case 2:

newp = t + t % 10000 / 1000 * 9000;

if(!set.contains(newp))

newp = t + t % 100 / 10 * 9990;

if(!set.contains(newp))

break;

}case 1:

newp = t - t / 100 % 10 * 100 + t / 100 % 10 * 100000;

if(!set.contains(newp))

break;}}

}return -1;

}

77 開燈問題

時間限制 3000 ms 記憶體限制 65535 kb 難度 1 描述 有n盞燈,編號為1 n,第1個人把所有燈開啟,第2個人按下所有編號為2 的倍數的開關 這些燈將被關掉 第3 個人按下所有編號為3的倍數的開關 其中關掉的燈將被開啟,開著的燈將被關閉 依此類推。一共有k個人,問最後有哪些燈開著?輸...

77 火車進站

題目描述 給定乙個正整數n代表火車數量,0輸出描述 輸出以字典序從小到大排序的火車出站序列號,每個編號以空格隔開,每個輸出序列換行,具體見sample。示例1輸入 31 2 3 輸出1 2 3 1 3 2 2 1 3 2 3 1 3 2 1 此處所謂字典序排序的意思是這n輛火車有多少種出站的可能順序...

7 7 古風排版

中國的古人寫文字,是從右向左豎向排版的。本題就請你編寫程式,把一段文字按古風排版。輸入在第一行給出乙個正整數n 100 是每一列的字元數。第二行給出乙個長度不超過1000的非空字串,以回車結束。按古風格式排版給定的字串,每列n個字元 除了最後一列可能不足n個 4this is a test case...