滑動解鎖是智慧型手機一項常用的功能。你需要在3x3的點陣上,從任意乙個點開始,反覆移動到乙個尚未經過的"相鄰"的點。這些劃過的點所組成的有向折線,如果與預設的折線在圖案、方向上都一致,那麼手機將解鎖。兩個點相鄰當且僅當以這兩個點為端點的線段上不存在尚未經過的點。此外,這條折線還需要至少經過4個點。
為了描述方便,我們給這9個點從上到下、從左到右依次編號1-9。那麼1->2->3是不合法的,因為長度不足。1->3->2->4也是合不法的,因為1->3穿過了尚未經過的點2。2->4->1->3->6是合法的,因為1->3時點2已經被劃過了。
作為乙個愛逛知乎的好少年,小hi已經知道一共有389112種不同的解鎖方案。不過小hi不滿足於此,他希望知道,當已經瞥視到一部分折線的情況下,有多少種不同的方案。
遺憾的是,小hi看到的部分折線既不一定是連續的,也不知道方向。例如看到1-2-3和4-5-6,那麼1->2->3->4->5->6,1->2->3->6->5->4, 3->2->1->6->5->4->8->9等都是合法的方案。
第一行包含乙個整數t(1 <= t <= 10),代表測試資料組數。
每個測試資料第一行是乙個整數n(0 <= n <= 8),代表小hi看到的折線段數目。
以下n行每行包含兩個整數x, y (1 <= x, y <= 9),代表小hi看到點x和點y是直接相連的。
對於每組資料輸出合法的方案數目。
題解:一開始看到這道題,有點嚇到了,畢竟谷歌筆試題,反正自己能做出來就做吧,做不出來就算了。
可以想象成多個樹要串成1棵樹,只不過有特殊的情況要考慮進去就可以了。
像 1 -> 3 要 考慮 (1 + 3) / 2 = 2 這個點有沒有被劃過。
在init函式裡就是考慮這樣的點。
其他方面深搜就好了。
#include #include #include using namespace std;
int cnt,aim_depth ;
int vis[10] ;
int record[10][10];
int map[10][10];
int total_edge ;
void init()
void dfs(int num,int depth,int edge)
for(int i = 1;i < 10;i++) }
}int main()
cnt = 0 ;
total_edge = n ;
for(aim_depth = max(4,n+1);aim_depth <= 9;aim_depth++)
}cout << cnt << endl;
}}
hihoCoder 1054 滑動解鎖
時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 滑動解鎖是智慧型手機一項常用的功能。你需要在3x3的點陣上,從任意乙個點開始,反覆移動到乙個尚未經過的 相鄰 的點。這些劃過的點所組成的有向折線,如果與預設的折線在圖案 方向上都一致,那麼手機將解鎖。兩個點相鄰當且僅當以這兩個點...
滑動解鎖 HihoCoder 1054
滑動解鎖是智慧型手機一項常用的功能。你需要在3x3的點陣上,從任意乙個點開始,反覆移動到乙個尚未經過的 相鄰 的點。這些劃過的點所組成的有向折線,如果與預設的折線在圖案 方向上都一致,那麼手機將解鎖。兩個點相鄰當且僅當以這兩個點為端點的線段上不存在尚未經過的點。此外,這條折線還需要至少經過4個點。為...
HihoCoder 1054 滑動解鎖 dfs
時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 滑動解鎖是智慧型手機一項常用的功能。你需要在3x3的點陣上,從任意乙個點開始,反覆移動到乙個尚未經過的 相鄰 的點。這些劃過的點所組成的有向折線,如果與預設的折線在圖案 方向上都一致,那麼手機將解鎖。兩個點相鄰當且僅當以這兩個點...