滑動解鎖 HihoCoder 1054

2021-08-16 22:37:44 字數 1503 閱讀 1618

滑動解鎖是智慧型手機一項常用的功能。你需要在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是直接相連的。

對於每組資料輸出合法的方案數目。

3  

0 8

1 2

2 3

3 4

4 5

5 6

6 7

7 8

8 9

4 2 4

2 5

8 5

8 6

389112  

2 258

1 2 3

4 5 6

7 8 9

先初始化一下此矩陣,將每兩個數字之間如需經過則必要訪問過的數字存入f陣列。

(例如f[1][3]=f[3][1]=2 f[1][9]=f[9][1]=5 f[1][8]=f[8][1]=0)

然後就dfs了,兩個引數,乙個是目前已連線段數,另乙個是到了第幾個數字。

#include

const

int m=9;

int t,n,cnt,ans,vis[m+5];

int k[m+5][m+5],f[m+5][m+5];

void dfs(int x,int tot)

vis[x]=0;

}int main()

for(int i=1;i<=m;i++)

dfs(i,1);

printf("%d\n",ans);

for(int i=1;i<=m;i++)

ans=cnt=0;

}}/*

1 2 3

4 5 6

7 8 9

*/

hihoCoder 1054 滑動解鎖

時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 滑動解鎖是智慧型手機一項常用的功能。你需要在3x3的點陣上,從任意乙個點開始,反覆移動到乙個尚未經過的 相鄰 的點。這些劃過的點所組成的有向折線,如果與預設的折線在圖案 方向上都一致,那麼手機將解鎖。兩個點相鄰當且僅當以這兩個點...

HihoCoder 1054 滑動解鎖 dfs

時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 滑動解鎖是智慧型手機一項常用的功能。你需要在3x3的點陣上,從任意乙個點開始,反覆移動到乙個尚未經過的 相鄰 的點。這些劃過的點所組成的有向折線,如果與預設的折線在圖案 方向上都一致,那麼手機將解鎖。兩個點相鄰當且僅當以這兩個點...

Hihocoder 1054滑動解鎖 谷歌筆試題

滑動解鎖是智慧型手機一項常用的功能。你需要在3x3的點陣上,從任意乙個點開始,反覆移動到乙個尚未經過的 相鄰 的點。這些劃過的點所組成的有向折線,如果與預設的折線在圖案 方向上都一致,那麼手機將解鎖。兩個點相鄰當且僅當以這兩個點為端點的線段上不存在尚未經過的點。此外,這條折線還需要至少經過4個點。為...