時間限制:2000ms
單點時限:1000ms
記憶體限制:256mb
滑動解鎖是智慧型手機一項常用的功能。你需要在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
典型的深搜,用option來記錄非必須經過邊的個數,用optionmax來記錄非必須經過邊的最大值,那麼,我的深搜**可以通過給出的用例,但還是掛了,who can tell me why?
#include #include #include #include #include #include #include using namespace std;
bool exist[10][10] = ;
int vis[10] = ;
int cnt = 0;
void init()
void dfs(int start, int depth, int option, int optionmax, int n, vector>& mp)
for (int i = 1; i <= 9; ++i)
}}int main()
cnt = 0;
for (i = max(n,3); i < 9; ++i)
}printf("%d\n", cnt);
} return 0;
}
再補乙個能過的codes:
#includeusing namespace std;
int ans = 0;
int n, m;
const int max = 20;
int vis[max][max], a[max][max];
bool judge(int x, int y, int i, int j)
return 1;
}void dfs(int x, int y, int step, int flag)
}int main()
for(int i = 0; i < 3; i++)
}printf("%d\n", ans);
}return 0;
}
滑動解鎖 HihoCoder 1054
滑動解鎖是智慧型手機一項常用的功能。你需要在3x3的點陣上,從任意乙個點開始,反覆移動到乙個尚未經過的 相鄰 的點。這些劃過的點所組成的有向折線,如果與預設的折線在圖案 方向上都一致,那麼手機將解鎖。兩個點相鄰當且僅當以這兩個點為端點的線段上不存在尚未經過的點。此外,這條折線還需要至少經過4個點。為...
HihoCoder 1054 滑動解鎖 dfs
時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 滑動解鎖是智慧型手機一項常用的功能。你需要在3x3的點陣上,從任意乙個點開始,反覆移動到乙個尚未經過的 相鄰 的點。這些劃過的點所組成的有向折線,如果與預設的折線在圖案 方向上都一致,那麼手機將解鎖。兩個點相鄰當且僅當以這兩個點...
Hihocoder 1054滑動解鎖 谷歌筆試題
滑動解鎖是智慧型手機一項常用的功能。你需要在3x3的點陣上,從任意乙個點開始,反覆移動到乙個尚未經過的 相鄰 的點。這些劃過的點所組成的有向折線,如果與預設的折線在圖案 方向上都一致,那麼手機將解鎖。兩個點相鄰當且僅當以這兩個點為端點的線段上不存在尚未經過的點。此外,這條折線還需要至少經過4個點。為...